我正在使用.NET 6.0.11构建Blazor Server应用,并使用Http.Sys进行部署。服务器和客户端都在同一个Windows域中。我希望根据用户的域登录授权,而不是构建与此应用程序特定的用户名/密码数据库和基础架构。
以下是在Program.cs
中启用Windows身份验证的代码,基于官方文档中的代码:
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
builder.Services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);
builder.WebHost.UseHttpSys(options =>
{
options.Authentication.Schemes =
AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate;
options.Authentication.AllowAnonymous = false;
});
}
// ...
app.UseAuthentication();
app.UseAuthorization();
我使用ASP.NET Core Blazor身份验证和授权中的第一个代码示例查看身份验证状态。
如果我在http://localhost:55555
上启动应用程序,那么页面会立即加载,并成功显示我的域和用户名。
但是,如果我将应用程序作为http://mycomputername.our.domain:55555
启动,并在同一台机器上通过Chrome或Edge访问它,则会弹出一个要求输入用户名和密码的窗口:
注意:我曾经只运行了一次netsh http add urlacl url=....
;这个命令是在更改启动URL后第一次运行时生成的异常消息建议的。
输入我的域登录用户名和密码被接受,并且之前的代码示例成功显示了我的用户名。我还注意到以下行为:
- 设置
AllowAnonymous = true;
意味着它根本不会提示输入用户名/密码;页面只是以未经身份验证的用户继续。 - 如果用户名/密码(针对域上的用户)输入不正确,则会立即生成HTTP错误401,它永远不会尝试执行Blazor默认错误页面。
- 我希望认证是在客户端和域控制器之间进行的,而不是通过HTTP连接发送用户的密码!
我假设上述行为对于在访问此服务器的不同机器上使用其他域的用户也是相同的,尽管我还没有测试过。
我的问题:
- 是否可以跳过用户名/密码弹出窗口,只获取已在客户端计算机上登录并进行访问的域用户?
- (如果不行)将部署到IIS而不是Http.Sys是否会改变任何内容?
在这个SO线程上似乎有基于Blazor的解决方案被讨论,但我不知道如何使用它们,因为弹出窗口总是在任何页面尝试渲染之前出现;如果登录失败,则会生成HTTP 401错误,并且不会执行任何Blazor页面。
注:由于文档指出Kestrel不支持Windows身份验证,我使用了HTTP.sys而非Kestrel;然而现在我使用Kestrel也可以工作了,同时结合被接受的答案中的信息--不确定那里的情况是什么。