到目前为止,我们一直在使用 Azure 内置的 Easy Auth 为 Azure 部署的 Web 应用程序提供身份验证,但决定实现我们自己的 AuthN,因为我们需要更大的灵活性。
所以我在
Program.cs
中添加了以下配置:
string stsDiscoveryEndpoint = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
ConfigurationManager<OpenIdConnectConfiguration> configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
stsDiscoveryEndpoint, new OpenIdConnectConfigurationRetriever());
OpenIdConnectConfiguration openIdConfig = configurationManager.GetConfigurationAsync().Result; //Please ignore .Result
builder.Services.AddAuthentication()
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, opts =>
{
opts.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuers = new[]
{
"Issuer1",
"Issuer2"
},
ValidateIssuerSigningKey = true,
IssuerSigningKeys = openIdConfig.SigningKeys,
//TryAllIssuerSigningKeys = true,
ValidateLifetime = true,
ValidAudiences = new[]
{
"Audience1",
"Audience2"
},
};
});
使用 Easy Auth,如果 AuthN 失败,控制将无法到达我的 AuthZ 过滤器实现。通过这些设置,无论 JWT 验证失败还是成功,控制权都会到达我的 AuthZ 过滤器。
问题1:如何判断AuthN是否失败?
此外,通过 Easy Auth,我可以使用以下方法提取呼叫者的身份:
string? userId = authorizationFilterContext.HttpContext.User.Identity?.Name;
在我的 AuthZ 过滤器中,但这不适用于
JwtBearer
中间件。
问题 2: 如何使用
JwtBearer
中间件进行等效操作?
我来解答你的两个问题:
要检查身份验证是否失败,请查看过滤器中的用户对象:
if (!context.HttpContext.User.Identity?.IsAuthenticated ?? false)
{
// Auth failed
}
要使用 JWT 获取用户 ID,您需要从声明中获取它。确切的声明取决于您的令牌设置,但通常:
string? userId = context.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
// or
string? userId = context.HttpContext.User.FindFirstValue("preferred_username");
别忘了添加:
csharpCopyusing System.Security.Claims;
希望这有帮助!如果您还需要什么,请告诉我。