我会尽力解释我的问题。
目前我正在处理一个要求,其中用户可以使用本地数据库用户登录并可以使用 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"
},
但它抛出以下错误“方案已经存在:承载”
现在我的问题是我们如何一起使用多个令牌验证器,以及我们如何从一个验证器检查令牌是否有效,因此我们不应该检查另一个验证器。
答案 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 以获取更多信息