使用Windows身份验证对ASP.NET Core基于角色的授权进行故障排除

时间:2020-09-30 18:57:01

标签: c# asp.net-core authorization blazor-server-side

关于在IIS上托管的独立的服务器端Blazor应用程序,我们已将该应用程序配置为使用Windows身份验证和从Active Directory组派生的基于角色的授权。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    //....
}

public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...
    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
}

在应用程序中,我们使用<AuthorizeView />组件和AuthenticationState来控制访问。

我们有一个临时环境和生产环境。据我所知,这两个环境的配置是相同的,只是在登台服务器上将ASPNETCORE_ENVIRONMENT设置为Staging

登台环境按预期工作。创建了一些诊断输出以尝试了解正在发生的事情:

@page "/diag"

<h3>Diag</h3>

<AuthorizeView>

    <div>
        User.Identity.IsAuthenticated: @context.User.Identity.IsAuthenticated
    </div>

    <div>
        User.Identity.AuthenticationType: @context.User.Identity.AuthenticationType
    </div>

    <div>
        AuthenticationStateContext.User.Identity.Name: @context.User.Identity.Name
    </div>

    <div>
        User.IsInRole(Administrator): @context.User.IsInRole(Roles.Administrator)
    </div>

</AuthorizeView>

Roles.Administrator是一个常量字符串,它与管理员将AD组的名称匹配。

以Administrator组中的用户身份登录时,登台服务器会产生预期的结果:

User.Identity.IsAuthenticated: True
User.Identity.AuthenticationType: Negotiate
AuthenticationStateContext.User.Identity.Name: DOMAIN\my.name
User.IsInRole(Administrator): True

但是生产服务器进行身份验证,但无法识别该角色:

User.Identity.IsAuthenticated: True
User.Identity.AuthenticationType: Negotiate
AuthenticationStateContext.User.Identity.Name: DOMAIN\my.name
User.IsInRole(Administrator): False
据我所知,IIS应用程序已配置用于Windows身份验证。匿名身份验证已禁用,Windows身份验证已启用。 Windows身份验证似乎可以正常工作-但授权无效。

感谢您的反馈。

编辑

出现第一个问题后,继续进行故障排除。打开每个站点的浏览器开发人员控制台,并比较活动。注意,客户端指向登台服务器仅使用websocket url发出了一个blazor请求。指向生产服务器的客户端使用http生成了许多热烈的请求-我认为这意味着它已降级为长轮询。为什么不使用websockets?经过进一步调查,我发现我的生产Web服务器未安装websocket模块!安装后,该应用程序将按预期运行。

我要得出的结论是,服务器端火焰的授权在长轮询中可能无法达到预期的效果,但是我不确定要尝试回答我自己的问题。如果社区认为最好,我将很乐意将其关闭。也许有更好了解的人可以提供更完整的答案。

1 个答案:

答案 0 :(得分:1)

希望我可以将您的“编辑”标记为答案。这绝对是我的解决方法。在Server 2016 IIS上,我必须按照此处的说明安装Websocket模块:

https://docs.microsoft.com/en-us/iis/configuration/system.webserver/websocket