繁体   English   中英

禁用WebAPI的Windows身份验证

[英]Disable Windows Authentication for WebAPI

我正在使用MVC4应用程序并使用WebAPI来获取/发送我的所有数据。 在控制器中,我使用HttpClient请求来获取数据,并且一切正常。 我面临的问题是,当在项目中启用Windows身份验证时,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身份验证,但不一定是Web API控制器。 我试过在web.config中排除API控制器,如下所示:

<location path="api">
        <system.web>
            <authorization>
                <allow users="*"/>
        </authorization>
    </system.web>
</location>

但web.config的添加没有做任何事情。

有什么建议?

认证

Web API假定身份验证在主机中发生。 IIS使用HTTP模块进行身份验证。 asp.net现在允许您通过web.config配置内置到IIS或ASP.NET的任何身份验证模块,或编写您自己的HTTP模块以执行自定义身份验证。

在此输入图像描述

您可以同时使用多个身份验证,这不是问题。 在您的情况下,您需要Windows身份验证和匿名身份验证 Windows身份验证将保护您的WebSite,匿名身份验证将打开您的Web Api。

在IIS中配置身份验证

在IIS Express上托管打开“属性”窗格(通过F4而不是项目的属性),并应用所需的身份验证将“匿名身份验证”设置为“已禁用”。 将“Windows身份验证”设置为“已启用”。

在IIS 7或更高版本上承载在IIS管理器中,在功能视图中打开“身份验证”功能。 启用/禁用所需的身份验证 如果身份验证系统不是选项(例如Windows),则需要通过服务器管理器(添加角色服务)进行安装。

授权

asp.net授权

在ASP.NET中,有两种方法可以授权访问给定资源:文件和URL授权。 我不会在这里解释,但你可以阅读这篇文章

重要的是您可以在web.config中允许/拒绝用户和/或组。

Windows身份验证中的默认配置是仅允许身份验证用户*****,如下所示:

<authorization>
<deny users="?" ></deny>
</authorization>

如果你想允许匿名用户 在网址“api”下,添加:

<location path="api">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

Web Api授权

asp.net Web Api授权发生在管道的后面,靠近控制器。 这使您可以在授予对资源的访问权限时进行更精细的选择。

Web API提供了内置的授权过滤器AuthorizeAttribute 还有一个AllowAnonymousAttribute 您可以在全局,控制器或操作上使用它。 默认情况下,所有操作都已获得授权

测试Api

通过浏览器

集成Windows身份验证适用于支持协商身份验证方案的任何浏览器。 这是Internet Explorer和现在Chrome的cas:他们将在使用Windows身份验证浏览网站时自动提供Windows凭据。 Firefox不支持此方案,因此我经常使用此浏览器测试身份验证。

通过HttpClient您的HttpClient需要在调用Web Api(如浏览器)时提供凭据。 这是通过使用适当的凭据配置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身份验证。 您不必在开放和公共服务中配置任何凭据。

我在尝试做一些非常相似的事情时遇到了这个问题,并希望增加上面给出的答案。 我还没有找到关于如何做到这一点的大量详细信息。 在网络上只是点点滴滴。 所以希望这会增加那里的东西。

我有一个MVC4应用程序,它有一个WebAPI部分。 MVC应用程序需要使用Windows Auth,但WebAPI部分需要匿名并关闭Windows身份验证。 虽然上面的解决方案适用于ncbl,但它对我不起作用,因为在我的场景中我没有使用代码来处理凭据。 在我的场景中,我想要一个基于web.config或IIS的解决方案。 我开始使用Cyber​​maxs的web.config解决方案并添加到它。 这就是我最终的结果。

<!-- 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中,以便我可以覆盖此虚拟路径的身份验证。 我尝试在IIS中执行此操作,但由于它是一个虚拟路径,即Web服务器上不存在/ api,这对我来说是不可能的。

注意:请注意,IIS可能具有更高配置级别的配置文件,该配置级别锁定<authentication>部分,例如在application.config或machine.config中。 元素可能将allowOverride属性设置为false。 我一开始得到HTTP错误500.19(HRESULT:0x80070021),并且必须进入application.config文件才能更改此属性。 我在这里找到了有关此错误的更多详情。

一旦我在web.config的<location>部分中有了这个附加部分,我就确保用[AllowAnonymous]装饰我的api控制器。 然后bam ......一切都开始起作用了。

这就是我为应用程序的根目录进行身份验证和授权设置的方法。

<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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM