You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core MVC Azure角色授权失败:无角色声明返回

问题排查:ASP.NET Core + Azure AD 授权403及客户端密钥错误

我用.NET6构建ASP.NET Core Web应用,已按GitHub上Azure示例仓库完成配置:调整appsettings.json的AzureAd配置项,在Azure AD创建应用注册、定义Reader/Admin角色并完成企业应用角色分配。

Web应用配置了身份验证与授权策略,控制器添加带[Authorize]属性的测试端点。登录后无授权属性的端点可正常访问,但带授权的端点返回403并跳转至AccessDenied页面。根据官方文档,角色声明应随ID Token返回,但不确定是声明未发送还是无法解析,也不清楚调试方法。另外,隐私窗口访问Reader端点时出现500错误,提示AADSTS7000215(客户端密钥无效),但已确认密钥配置正确。


相关配置代码

appsettings.json的AzureAd段

"AzureAd": {
    "ClientId": "my-client-guid",
    "TenantId": "my-tenant-guid",
    "Domain": "my-tenant-name",
    "ClientSecret": "my-client-secret-guid",
    "Instance": "https://login.microsoftonline.com/",
    "Scopes": "user.read,profile,openid",
    "ClientCapabilities": [ "cp1" ],
    "CallbackPath": "/signin-oidc"
}

MicrosoftGraphConfiguration类

public class MicrosoftGraphConfiguration
{
    public const string ConfigurationName = "MicrosoftGraph";
    public string? GraphApiUrl { get; set; }
}

AzureAdConfiguration类

public class AzureAdConfiguration
{
    public const string ConfigurationName = "AzureAd";
    public string? ClientId { get; set; }
    public string? TenantId { get; set; }
    public string? ClientSecret { get; set; }
    public string? Domain { get; set; }
    public string? Instance { get; set; }
    public string? BaseUrl { get; set; }
    public string[]? ClientCapabilities { get; set; }
    public string[]? Scopes { get; set; }
    public string? CallbackPath { get; set; }
}

Program.cs关键配置

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<MicrosoftGraphConfiguration>(builder.Configuration.GetSection(MicrosoftGraphConfiguration.ConfigurationName));
builder.Services.Configure<AzureAdConfiguration>(builder.Configuration.GetSection(AzureAdConfiguration.ConfigurationName));

JwtSecurityTokenHandler.DefaultMapInboundClaims = false;

builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration, subscribeToOpenIdConnectMiddlewareDiagnosticsEvents: true)
    .EnableTokenAcquisitionToCallDownstreamApi(new string[] { "User.Read" })
    .AddInMemoryTokenCaches();

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AssignmentToReaderRoleRequired", policy => policy.RequireRole("Reader"));
    options.AddPolicy("AssignmentToAdminRoleRequired", policy => policy.RequireRole("Admin"));
});

builder.Services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
    options.TokenValidationParameters.RoleClaimType = "roles";
});

builder.Services.AddControllersWithViews(options =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();

var app = builder.Build();
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();

控制器测试代码

[HttpGet]
[Route("/Reader")]
[Authorize(Policy = AuthorizationPolicies.AssignmentToReaderRoleRequired)]
public IActionResult Reader()
{
    var asd = User;
    return Ok("He is a reader");
}

[HttpGet]
[Route("/Admin")]
[Authorize(Policy = AuthorizationPolicies.AssignmentToAdminRoleRequired)]
public IActionResult Admin()
{
    return Ok("He is an admin");
}

排查步骤

一、解决403授权失败问题

  • 验证ID Token是否包含角色声明
    在控制器的非授权端点(或登录后的首页)添加代码,输出当前用户的所有声明:

    var claims = User.Claims.Select(c => new { c.Type, c.Value });
    return Ok(claims);
    

    查看输出中是否存在type为roles的声明,且值包含Reader或Admin。如果没有,检查:

    • 应用注册的应用角色是否正确定义,确保allowedMemberTypes包含User。
    • 企业应用中是否已将用户/组正确分配到对应角色,分配后等待5-10分钟生效。
    • 应用注册的清单中accessTokenAcceptedVersion是否设置为2,否则可能导致角色声明未包含在ID Token中。
  • 确认角色声明映射正确
    当前代码已设置options.TokenValidationParameters.RoleClaimType = "roles";,需确保Configure<OpenIdConnectOptions>在AddMicrosoftIdentityWebAppAuthentication之后执行,避免配置被覆盖。调整Program.cs中的顺序,将OpenIdConnect配置移到身份验证注册之后。

  • 启用诊断日志
    由于已开启subscribeToOpenIdConnectMiddlewareDiagnosticsEvents: true,在appsettings.json中添加日志配置,查看认证过程细节:

    "Logging": {
      "LogLevel": {
        "Microsoft.Identity.Web": "Debug",
        "Microsoft.AspNetCore.Authentication.OpenIdConnect": "Debug"
      }
    }
    

    查看日志中是否有角色声明解析错误或ID Token内容异常。

二、解决隐私窗口AADSTS7000215错误

  • 检查客户端密钥有效性
    确认Azure AD应用注册中的客户端密钥未过期,且是客户端密码(非证书)。重新生成密钥,复制完整值(仅生成时可见)更新到appsettings.json,避免多余空格或换行。

  • 验证重定向URI
    确认应用注册中的重定向URI与appsettings.json的CallbackPath一致(如https://localhost:xxxx/signin-oidc),且类型为Web。

  • 重启应用测试
    隐私窗口禁用缓存,重启应用后重新测试,确保客户端密钥配置正确加载。


内容的提问来源于stack exchange,提问作者Neophyte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:31:17