1

我有一个WebApi使用基本身份验证很好。而且我有一个使用Forms Auth的MVC网站。但有以下几点:ASP.NET MVC与表单身份验证和WebApi与基本身份验证

客户端X拥有一个专用数据库,包含任意数量的联系人和产品。 MVC站点是他们的专用站点(通过{clientId}路由),允许他们的联系人登录(通过Forms Auth)并为他们的产品下订单。联系人必须以表格形式登录才能下订单。

产品订单(需要)击中WebApi以记录在客户数据库中。

但是由于WebApi使用基本身份验证来验证客户端,而不是发送订单的联系人,所以每个请求返回401 - 未经授权。

我检查出了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

经过多次撞击不那么谚语的墙壁,以及@ 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服务器解决它。

经过进一步考虑,现在看起来似乎合乎逻辑,因为它们本质上运行在不同的服务器上。

为了后代的缘故发表。

0

为什么不能有一个登录您的MVC网站,有能力为每个客户端提交订单?您的WebAPI只允许客户为自己提交订单是合理的。但我认为让MVC站点根据联系人进行身份验证是不同的客户端是合理的。您的MVC网站将不得不存储每个客户端的密码。

相反,为MVC网站创建一个登录名并赋予它为任何客户端提交订单的能力。

1

您的Web API是否与MVC站点位于相同的虚拟目录和配置下?它看起来像Forms Auth HTTP模块踢你的API,你不想要的。只要您不打算直接从浏览器调用API,请将其移至专门为基本身份验证设置的单独虚拟目录,而不是API的web.config中的表单验证模块。

+0

是的,他们肯定是在独立的虚拟目录与自己的配置。 MVC网站设置为“Forms”,WebApi在web.configs中设置为“None”。 – McCee

+0

感谢您的正确方向。明白了。 – McCee