如何在Blazor WebAssembly中使用Windows NTLM认证连接SignalR Hub
Blazor WebAssembly通过Windows NTLM认证连接SignalR Hub的解决方案
由于浏览器沙箱限制,UseDefaultCredentials = true在Blazor WASM中不被支持,必须依赖浏览器内置的NTLM协商机制来实现认证,以下是具体配置步骤:
一、服务端(ASP.NET Core)配置
- 启用Windows认证和SignalR服务
在Program.cs中添加认证中间件并配置SignalR:
var builder = WebApplication.CreateBuilder(args); // 配置Windows认证(使用Negotiate方案,支持NTLM和Kerberos) builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme) .AddNegotiate(); // 配置授权策略,确保所有请求都需要认证 builder.Services.AddAuthorization(options => { options.FallbackPolicy = options.DefaultPolicy; }); // 注册SignalR服务 builder.Services.AddSignalR(); var app = builder.Build(); app.UseHttpsRedirection(); // 启用认证和授权中间件 app.UseAuthentication(); app.UseAuthorization(); // 映射你的SignalR Hub app.MapHub<YourHub>("/yourHubEndpoint"); app.Run();
- 服务器环境配置
- 如果用Kestrel:确保服务器已加入域,Kestrel会自动支持NTLM协商;
- 如果部署在IIS:在站点属性中启用Windows认证,禁用匿名认证。
二、Blazor WebAssembly客户端配置
在客户端Program.cs中配置SignalR连接时,启用WithCredentials,让浏览器自动处理NTLM凭据发送:
builder.Services.AddScoped(sp => { var navManager = sp.GetRequiredService<NavigationManager>(); var hubConnection = new HubConnectionBuilder() .WithUrl($"{navManager.BaseUri}yourHubEndpoint", options => { // 关键:告诉浏览器发送凭据(NTLM协商需要这个) options.WithCredentials = true; // 不要设置UseDefaultCredentials,浏览器不支持该属性 }) .Build(); return hubConnection; });
三、跨域(CORS)配置(若客户端与服务端不同源)
如果Blazor客户端和SignalR服务端不在同一域名下,必须在服务端配置CORS允许凭据传递:
builder.Services.AddCors(options => { options.AddPolicy("AllowBlazorClient", policy => { policy.WithOrigins("https://your-blazor-client-url.com") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); // 必须启用,否则浏览器不会发送NTLM凭据 }); }); // 在管道中启用CORS app.UseCors("AllowBlazorClient");
四、核心注意事项
- 浏览器仅在同源请求或已配置允许凭据的CORS请求下,才会自动发起NTLM协商;
- 客户端浏览器必须处于域环境中(已登录域账号),才能自动提供NTLM凭据;
- 不要手动设置Authorization头,NTLM认证依赖浏览器与服务端的握手过程,无需手动干预;
- 测试时确保服务端已禁用匿名认证,否则浏览器不会触发NTLM协商。
内容的提问来源于stack exchange,提问作者Gabriel Weidmann
相关产品推荐
相关产品推荐

