【问题标题】:Disable Windows Authentication for WebAPI禁用 WebAPI 的 Windows 身份验证
【发布时间】:2013-01-13 08:20:33
【问题描述】:

我正在使用 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 的添加什么也没做。

有什么建议吗?

【问题讨论】:

  • 您找到解决方案了吗?我正在寻找同样的东西。
  • 是的,我做了,我发现你需要这样做: HttpClientHandler handler = new HttpClientHandler(); handler.UseDefaultCredentials = true;使用 (var client = new HttpClient(handler)) { } }
  • @ncbl - 你在哪里以及如何添加这个?在母版页上?你能寄给我示例代码吗? (ASP.NET Intranet 站点使用 Visual Studio 2013 - .NET 4.5 Framework)

标签: c# asp.net-mvc-4 asp.net-web-api


【解决方案1】:

认证

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

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

在 IIS 中配置身份验证

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

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

授权

asp.net 授权

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

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

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

<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 授权发生在管道的后期,更靠近控制器。这使您可以在授予资源访问权限时做出更精细的选择。

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

测试 API

通过浏览器

集成的 Windows 身份验证适用于任何支持协商身份验证方案的浏览器。这是 Internet Explorer 和现在的 Chrome 的 cas:当浏览具有 Windows 身份验证的网站时,它们将自动提供 Windows 凭据。火狐不支持这种方案,所以我经常用这个浏览器测试认证。

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

【讨论】:

  • 非常感谢您的详细回复!您在代码中的解决方案,特别是 UseDefaultCredentials = true 为我解决了这个问题。我真的很感谢详细的回复!
  • 很棒的帖子...我不知道在哪里添加此代码(//use default credentials aka Windows Credentials ...)?我认为我将使用用户名/密码或 Windows 凭据代码,但我不确定在哪里添加它们。 (我在 Windows 2008R2 服务器上使用 asp.net 4.5 框架和带有 IIS7.5 的 Visual Studio 2013 有一个 Intranet 视线)。
  • "通过 F4 而不是项目的属性" - 伙计,你拯救了我的一天!非常感谢。
  • 在哪里添加这个 ??? “在url位置“api”下”这是哪里???
【解决方案2】:

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

我有一个包含 WebAPI 部分的 MVC4 应用程序。 MVC 应用程序需要使用 Windows 身份验证,但 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>

对我来说,关键是将&lt;system.webServer&gt; 部分添加到 web.config,以便我可以覆盖此虚拟路径的身份验证。我尝试在 IIS 中执行此操作,但由于它是虚拟路径,即 /api 在 Web 服务器上不存在,这对我来说是不可能的。

注意:请注意,IIS 可能有一个更高配置级别的配置文件正在锁定&lt;authentication&gt; 部分,例如在 application.config 或 machine.config 中。一个元素可能将属性 allowOverride 设置为 false。起初我收到了 HTTP 错误 500.19 (HRESULT: 0x80070021) 并且必须进入 application.config 文件来更改此属性。我找到了有关此错误的更多详细信息here

一旦我在 web.config 的 &lt;location&gt; 部分中添加了这个附加部分,我确保使用 [AllowAnonymous] 装饰我的 api 控制器。然后砰……一切都开始起作用了。

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

<system.web>
  <authentication mode="Windows" />
  <authorization>
    <!-- Deny all anonymous users at the root of the application -->
    <deny users="?" />
  </authorization>
</system.web>

【讨论】:

  • 对 HTTP 错误 500.19 的评论。确保您可以覆盖 applicationHost.config 中的身份验证设置
  • 缺失的装饰 [AllowAnonymous] 最终为我解决了
  • 注意:为了允许覆盖匿名/windowsAuthentication 部分,仅编辑 applicationHost.config 是行不通的。我不得不在 IIS 中使用配置编辑器。然后它起作用了! (见serverfault.com/questions/360438/…
  • 这是唯一可行的答案。但是该死的 IIS 及其配置继承,尤其是当父配置可以阻止覆盖时。这是部署地狱。
  • 在 localhost 中工作..这部分在哪里?在根 web.config 中?
【解决方案3】:

这是我需要做的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2012-09-12
    • 2014-04-05
    相关资源
    最近更新 更多