.NET 6.0 Blazor部署IIS遇MSAL Client_Credentials_Required错误
解决方案
问题根源
你的错误来自两个核心配置问题:一是Azure AD配置字段名不匹配,二是重复添加了冲突的认证中间件,IIS环境下的中间件执行逻辑放大了这些问题,导致机密客户端凭据无法正确加载。
步骤1:修正appsettings.json配置字段
MSAL与Microsoft Identity Web框架默认读取ClientSecret字段而非Secret,这是本地Kestrel兼容但IIS环境下严格校验导致的凭据缺失问题。修改AzureAd配置段:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "<redacted>", "TenantId": "consumers", "ClientId": "<redacted>", "CallbackPath": "/signin-oidc", "ClientSecret": "<redacted>" // 将原"Secret"改为"ClientSecret" }, "MicrosoftGraph": { "BaseUrl": "https://graph.microsoft.com/v1.0", "Scopes": "user.read" },
步骤2:移除冲突的认证中间件
AddMicrosoftIdentityWebApp已完整配置Azure AD的OpenID Connect认证,重复添加AddMicrosoftAccount会引入独立的微软账户认证方案,导致回调时认证上下文混乱。删除Program.cs中以下代码块:
builder.Services.AddAuthentication().AddMicrosoftAccount(microsoftOptions => { microsoftOptions.ClientId = configuration["AzureAd:ClientId"]; microsoftOptions.ClientSecret = configuration["AzureAd:Secret"]; });
步骤3:确认IIS部署配置
- 应用程序池设置:将.NET CLR版本设为
No Managed Code(.NET 6为独立部署,无需IIS托管代码支持);使用ApplicationPoolIdentity或有权限读取appsettings.json的账户。 - 重定向URI验证:在Azure AD应用注册的「身份验证」页面,添加IIS部署的完整回调URI(例如
https://你的IIS域名/signin-oidc),类型选择「Web」。
步骤4:校验中间件顺序
确保Program.cs中中间件顺序正确,UseAuthentication和UseAuthorization必须在UseRouting之后、UseEndpoints之前:
var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 关键顺序:先认证再授权 app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); app.Run();
完成以上修改后,重新部署到IIS即可解决回调时的内部服务器错误。
内容的提问来源于stack exchange,提问作者VorTechS
相关产品推荐
相关产品推荐

