禁用WebAPI的Windows身份validation
我正在玩MVC4应用程序,并使用WebAPI来获取/发送我的所有数据。 在一个控制器,我正在使用HttpClient请求来获取数据,所有工作正常。 我面临的问题是,当在项目中启用Windows身份validation时,Web API调用正在返回401 Unauthorized错误。
在我的控制器中执行调用的代码是:
using (var client = new HttpClient()) { var invoiceDetailUrl = BASE_URL + Url.HttpRouteUrl( "DefaultApi", new { controller = "InvoiceDetails", id = id } ); var result = client.GetAsync(invoiceDetailUrl).Result; }
Windows身份validation必须在站点上,但不一定是Web API控制器。 我已经尝试在web.config中排除API控制器,如下所示:
<location path="api"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location>
但添加到web.config没有做任何事情。
有什么build议么?
authentication
Web API假定authentication发生在主机中。 IIS使用HTTP模块进行身份validation。 asp.net现在允许你通过web.configconfiguration任何内置于IIS或ASP.NET的authentication模块,或者编写你自己的HTTP模块来执行自定义authentication。
您可以同时使用多个身份validation,这不是问题。 在你的情况下,你需要Windowsauthentication和匿名authentication 。 Windows身份validation将保护您的WebSite,并且匿名身份validation将打开您的Web Api。
在IIS中configuration身份validation
在IIS Express上进行托pipe打开“属性”窗格(通过F4而不是项目的属性),然后将所需的身份validation设置为“匿名身份validation”为“已禁用”。 将“Windows身份validation”设置为“已启用”。
在IIS 7或更高版本上托pipe在IISpipe理器中,打开function视图中的身份validationfunction。 启用/禁用所需的authentication。 如果authentication系统不是一个选项(如Windows),则需要通过服务器pipe理器(添加angular色服务)进行安装。
授权
asp.net授权
在ASP.NET中,有两种方法来授权访问给定的资源:文件和Url授权。 我不会在这里解释,但你可以阅读这篇文章 。
重要的是你可以允许/拒绝web.config中的用户和/或组。
Windows身份validation中的默认configuration是仅允许身份validation用户*****,如下所示:
<authorization> <deny users="?" ></deny> </authorization>
如果你想允许匿名用户? 在url位置“api”下添加这个:
<location path="api"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location>
Web Api授权
asp.net Web Api授权发生在pipe道后面,靠近控制器。 这可以让您在授予对资源的访问权时进行更细粒度的select。
Web API提供了一个内置的授权filterAuthorizeAttribute 。 还有一个AllowAnonymousAttribute 。 您可以在全局,控制器或操作上使用它。 默认情况下,所有操作都是授权的 。
testingApi
通过浏览器
集成Windows身份validation适用于任何支持协商身份validationscheme的浏览器。 它是Internet Explorer和Chrome的支持者:他们将在使用Windows身份validation浏览网站时自动提供Windows凭据。 Firefox不支持这个scheme,所以我经常使用这个浏览器来testingauthentication。
通过HttpClient你的HttpClient需要在调用Web Api(如浏览器)时提供凭证。 这是通过configuration具有适当凭据的HttpClientHandler完成的。
//use default credentials aka Windows Credentials HttpClientHandler handler = new HttpClientHandler() { UseDefaultCredentials = true }; //use username/password credentials HttpClient client = new HttpClient(handler); var handler = new HttpClientHandler { Credentials = new NetworkCredential(username, password) }; var httpClient = new HttpClient(handler);
希望这会帮助你。
最后一件重要的事情就是你的Web Api 不允许匿名用户 ! 因为您在HttpClientHandler中使用默认凭证 ,这意味着您的服务需要Windows身份validation。 您不必在公开和公共服务中configuration任何凭据。
我遇到这个问题的时候,试图做一些非常相似的事情,并想增加上面给出的答案。 我还没有find很多关于如何做到这一点的详细信息。 只是点点滴滴地遍布整个networking。 所以希望这会增加到那里。
我有一个MVC4应用程序,它有一个WebAPI的一部分。 MVC应用程序需要使用Windows身份validation,但WebAPI部分需要匿名并closuresWindows身份validation。 虽然上面的解决scheme适用于ncbl,但它不适合我,因为在我的情况下,我没有使用代码来处理凭据。 在我的scheme中,我想要一个基于web.config或IIS的解决scheme。 我开始使用Cybermaxs的web.config解决scheme并添加到它。 这是我最后的结果。
<!-- Configure the virtual path api --> <!-- This section is like a mini-web.config for the virtual path --> <location path="api"> <system.web> <authorization> <!-- All anonymous users access to the virtual path api --> <allow users="?" /> </authorization> </system.web> <!-- Need to include the security overrides else it will inherit from the root of the application --> <system.webServer> <security> <authentication> <!-- Need to enable anonymous access and turn off Windows authentication for the virtual path --> <anonymousAuthentication enabled="true"/> <windowsAuthentication enabled="false"/> </authentication> </security> </system.webServer> </location>
我的关键是将<system.webServer>
部分添加到web.config,以便我可以重写此虚拟path的身份validation。 我试图在IIS中这样做,但由于它是一个虚拟path,即/ Web服务器上不存在/ API,这是不可能的。
注意:请注意,IIS可能有一个更高configuration级别的configuration文件,用于locking<authentication>
部分,例如在application.config或machine.config中。 一个元素可能具有属性allowOverride设置为false。 我得到一个HTTP错误500.19(HRESULT:0x80070021)在第一次,必须进入到application.config文件来改变这个属性。 我在这里发现了这个错误的更多细节。
一旦我在我的web.config的<location>
部分有了这个额外的部分,我确保用[AllowAnonymous]
装饰我的api控制器。 然后呢…这一切开始工作。
这是我如何对我的应用程序的根进行身份validation和授权设置。
<system.web> <authentication mode="Windows" /> <authorization> <!-- Deny all anonymous users at the root of the application --> <deny users="?" /> </authorization> </system.web>
这是我需要做的:
<location path="api"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location>