Web Api 2 控制器在 Visual Studio 2012 与 2013 中的行为不同,授权属性

Web Api 2 Controller behaves different in Visual Studio 2012 vs 2013, Authorize Attribute

包含我的 MVC 5/Web Api 2 web 项目的 精确、精确的 .sln 文件 表现出一种方式,当我 运行 它来自Visual Studio 2012 安装和 运行 与 Visual Studio 2013 的安装完全不同。

特别是,我有一个继承自 ApiController 的 CustomerController,它响应 OData 查询(不,我没有继承自 OdataController)。当 运行 从 Visual Studio 2012 年(以及部署到我的 2008 R2 测试 Web 服务器)开始使用时,一切都很好。当我从 Visual Studio 2013 年 运行 它时,我得到了这个响应正文:

{"Message":"Authorization has been denied for this request."} 

是的,我的控制器装饰有授权属性:

<Authorize(Roles:="MYCORP\my_activedirectory_group")>
Public Class CustomerController

当我删除该属性时,我 可以 运行 我的本地项目 Visual Studio 2013(目前正在 IIS 中启动我的项目Express,而在 VS 2012 中它从 ASP.NET 开发服务器启动它)

怎么回事?

好的,我想通了。

显然,IIS Express 未配置为使用 Windows 身份验证。

我右键单击系统托盘中的 IIS Express 图标,然后选择 "Show All Applications"

在出现的对话框中,我选择了网格中列出的应用程序之一(只列出了 1 个,因为我在 Visual Studio 中只有 1 个 运行)

突出显示应用程序项后,您可以看到 hyperlink/file-path 到 applicationhost.config

在那个配置文件中,我编辑了这一部分,在 元素中找到了大约 1/3 的地方:

<authentication>
    <anonymousAuthentication enabled="false" userName="" />
    <basicAuthentication enabled="false" />
    <clientCertificateMappingAuthentication enabled="false" />
    <digestAuthentication enabled="false" />

    <iisClientCertificateMappingAuthentication enabled="false"></iisClientCertificateMappingAuthentication>

    <windowsAuthentication enabled="true">
        <providers>
           <add value="NTLM" />
           <add value="Negotiate" />
        </providers>
    </windowsAuthentication>
</authentication>

上面我将所有 'enabled' 属性设置为 'false' 除了 windowsAuthentication 元素上的最后一个属性。对于我们的环境,我总是将 NTLM 移到列出的提供程序中的第一位。