关于在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模块!安装后,该应用程序将按预期运行。
我要得出的结论是,服务器端火焰的授权在长轮询中可能无法达到预期的效果,但是我不确定要尝试回答我自己的问题。如果社区认为最好,我将很乐意将其关闭。也许有更好了解的人可以提供更完整的答案。
答案 0 :(得分:1)
希望我可以将您的“编辑”标记为答案。这绝对是我的解决方法。在Server 2016 IIS上,我必须按照此处的说明安装Websocket模块:
https://docs.microsoft.com/en-us/iis/configuration/system.webserver/websocket