我有一个很好地使用Basic Auth的WebApi。而且我有一个很好地使用Forms Auth的MVC网站。但是这里有个陷阱:
客户端X有一个专用数据库,其中包含任意数量的联系人和产品。MVC站点是一个专用于他们的站点(通过{clientId}路由),该站点允许其联系人登录(通过Forms Auth)并为其产品下订单。该联系人必须已正式登录才能下订单。
产品订单(需要)通过WebApi记录在客户的数据库中。
但是由于WebApi使用基本身份验证来验证客户端,而不是下订单的联系人,因此每个请求返回的都是401-未经授权。
我已经按照SO上许多帖子的建议来检查了ThinkTecture,但是由于我不想在WebApi中允许Forms Auth,因此并不能满足我的需要。我不想从WebApi中的客户端数据库中对联系人进行身份验证,我想在WebApi中对客户端进行身份验证。
有没有人遇到过类似的情况,我是否错过了显而易见的东西?也许我需要在网站上同时实现Forms和Basic?
我从站点进行的非常标准的Api呼叫(用户名和密码是客户的,而不是联系人的):
var clientId = new Guid(RouteData.Values["clientId"].ToString());
var baseUrl = ConfigurationManager.AppSettings["ApiBaseAddress"];
var authHeader = Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("{0}:{1}", _shoppingCartSettings.UserName, _shoppingCartSettings.Password)));
var requestUrl = String.Format("api/{0}/inventory", clientId.ToString());
var httpWebRequest = WebRequest.Create(baseUrl + requestUrl);
httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, "Basic " + authHeader);
httpWebRequest.Method = "GET";
httpWebRequest.Accept = "application/json";
httpWebRequest.ContentType = "application/json";
try
{
using (var httpWebResponse = httpWebRequest.GetResponse())
{
// we never get here because of a 401
}
}
catch (WebException ex)
{
using (var httpWebResponse = ex.Response)
{
// we always get here
}
}
如果我设置一个单独的测试客户端并进行相同的调用,则效果很好:/
在不那么广为人知的墙上撞了很多头之后,@ 0leg急切地推了一下,我找到了原因。
在我的WebApi项目文件的“ Web
>”下的“属性”中Servers
,将Visual Studio Development Server
其与Virtual Path
“ /”一起使用,而将我的MVC项目文件设置为使用Local IIS Web Server
。MVC项目也Apply server settings to all users (store in project file)
选中了该选项。
设置为使用本地IIS服务器都可以解决该问题。
经过进一步的考虑,由于它们实际上运行在不同的服务器上,因此现在看来是合乎逻辑的。
为了后代的缘故发布此消息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句