我很好地使用了Basic Auth的WebApi。我有一个很好地使用Forms Auth的MVC站点。但是这里有一个问题:
客户端X有一个包含任意数量的联系人和产品的专用数据库。 MVC站点是他们的专用站点(通过{clientId}路由),允许他们的联系人登录(通过Forms Auth)并为他们的产品下订单。联系人必须以表格登录才能下订单。
产品订单(需要)点击WebApi以记录在客户的数据库中。
但是,由于WebApi使用Basic Auth来验证客户端,而不是放置订单的联系人,每个请求都返回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
}
}
如果我设置一个单独的测试客户端并进行相同的调用,那么它很有效:/
答案 0 :(得分:1)
您的Web API是否与MVC站点位于相同的虚拟目录和配置下?看起来Forms Auth HTTP模块会为您的API提供支持,这是您不想要的。只要您不打算直接从浏览器调用API,请将其移动到专门为基本身份验证设置的单独虚拟目录,而不是API的web.config中的表单auth模块。
答案 1 :(得分:0)
为什么没有一个登录您的MVC网站能够为每个客户提交订单?您的WebAPI只允许客户自己提交订单是有意义的。但我认为将MVC站点作为基于联系人的不同客户端进行身份验证是不合理的。您的MVC站点必须存储每个客户端的密码。
相反,为MVC网站创建一个登录名,并让它能够为任何客户提交订单。
答案 2 :(得分:0)
经过多次撞击不那么谚语的墙,以及@ 0leg急需的推动之后,我发现了原因。
在Web
>下的我的WebApi项目文件的属性中Servers
,Visual Studio Development Server
与Virtual Path
“/”一起使用,而我的MVC项目文件设置为使用Local IIS Web Server
。 MVC项目还检查了Apply server settings to all users (store in project file)
选项。
设置两者以使用本地IIS服务器解决它。
经过进一步思考,这似乎是合乎逻辑的,因为它们实际上是在不同的服务器上运行。
为了后人的缘故发布此信息。