使用Forms Auth的ASP.NET MVC和使用Basic Auth的WebApi

时间:2014-05-16 15:13:18

标签: asp.net asp.net-mvc asp.net-web-api forms-authentication basic-authentication

我很好地使用了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
    }
}

如果我设置一个单独的测试客户端并进行相同的调用,那么它很有效:/

3 个答案:

答案 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项目文件的属性中ServersVisual Studio Development ServerVirtual Path“/”一起使用,而我的MVC项目文件设置为使用Local IIS Web Server。 MVC项目还检查了Apply server settings to all users (store in project file)选项。

设置两者以使用本地IIS服务器解决它。

经过进一步思考,这似乎是合乎逻辑的,因为它们实际上是在不同的服务器上运行。

为了后人的缘故发布此信息。