asp.net 核心自定义不记名令牌和 Azure Ad 令牌授权

时间:2021-07-29 12:02:00

标签: .net asp.net-core azure-active-directory jwt access-token

我会尽力解释我的问题。

目前我正在处理一个要求,其中用户可以使用本地数据库用户登录并可以使用 Azure AD 登录,我正在使用以下代码创建自定义令牌。

public static string GenerateJwtToken(string userId, string userName, string secret)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(secret);

        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new[]
            {
                new Claim(ClaimTypes.NameIdentifier, userId),
                new Claim(ClaimTypes.Name, userName)
            }),
            Expires = DateTime.UtcNow.AddDays(7),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };
        var token = tokenHandler.CreateToken(tokenDescriptor);
        var encryptedToken = tokenHandler.WriteToken(token);

        return encryptedToken;
    }

并使用以下代码验证令牌。

        public static IServiceCollection AddJwtAuthentication(this IServiceCollection services, IdentityAppSettings appSettings)
    {
        var key = Encoding.ASCII.GetBytes(appSettings.SecretKey);

        services
            .AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = false,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });
        return services;
    }

对于 Azure AD,我在 statup.cs 类中使用以下代码

services.AddMicrosoftIdentityWebApiAuthentication(Configuration, "AzureAd");

appsettings.json

  "AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "11121313213213132132",
"ClientId": "46853216534163",
"Audience": "api://11121313213213132132"

},

但它抛出以下错误“方案已经存在:承载”

现在我的问题是我们如何一起使用多个令牌验证器,以及我们如何从一个验证器检查令牌是否有效,因此我们不应该检查另一个验证器。

1 个答案:

答案 0 :(得分:0)

谢谢Chaodeng。发布您的建议作为答案以帮助其他社区成员。

需要从 AddAuthentication 中删除服务

使用 JWT 默认方案 JwtBearerDefaults.AuthenticationScheme 的 Azure AD 身份验证

这是示例配置

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer("MyAppName",options =>
            {
                 options.Authority = "Value";
                 options.Audience = "Value";                    
            })
            .AddMicrosoftIdentityWebApi(Configuration, "AzureAd");

这里是 SO 以获取更多信息