c# - 禁用 WebAPI 的 Windows 身份验证

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

我正在玩 MVC4 应用程序并使用 WebAPI 获取/发送我的所有数据。在 Controller 中,我使用 HttpClient 请求获取数据,一切正常。我面临的问题是,当在项目中启用 Windows 身份验证时,Web API 调用返回 401 Unauthorized 错误。

我的 Controller 中执行调用的代码是:

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 Controller 启用。我试过在 web.config 中排除 API Controller ,如下所示:

<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 模块来执行自定义身份验证。

enter image description here

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

在 IIS 中配置身份验证

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

在 IIS 7 或更高版本上托管 在 IIS 管理器中,在功能 View 中打开身份验证功能。启用/禁用所需的身份验证。如果身份验证系统不是一个选项(例如 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 授权发生在管道的后面,靠近 Controller 。这让您在授予资源访问权限时可以做出更精细的选择。

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

测试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 身份验证。您无需在开放和公共(public)服务中配置任何凭据。

关于c# - 禁用 WebAPI 的 Windows 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14588397/

相关文章:

C# HttpListener 作为 Windows 客户端上的 exe - 它会是 "hear"服务器推送吗?

asp.net-mvc-4 - 在MVC4中上传文件

html - 使用 MVC 数据注释和不显眼的验证进行 react

c# - 如何从 Web API 传递 pdf 并从 MVC Controller 读取 pdf?

jquery - 带 HTTPS POST 的移动应用程序安全性

c# - 让 Automapper 忽略 EF 中的非标量和导航属性

javascript - 如何使用 AXIOS Get 发送日期?

c# - 将鼠标光标锁定在图片框中的椭圆内

asp.net-mvc - MVC 4 中 app.config 的等价物是什么

rest - 找不到时如何处理 Web API ("REST") 中的嵌套资源?