作者:Lily賈麗 | 来源:互联网 | 2024-12-25 12:41
本文探讨了在使用AzureActiveDirectory进行用户身份验证时,结合AddAuthentication和RequireAuthenticatedUser的必要性及其潜在冗余问题。
在使用Azure Active Directory (Azure AD) 进行用户身份验证的过程中:
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureADBearer(optiOns=> this.Configuration.Bind("AzureAd", options));
根据文档中的“特定端点授权”部分,建议添加RequireAuthenticatedUser
:
services.AddAuthorization(o => o.AddPolicy(_RequireAuthenticatedUserPolicy, builder => builder.RequireAuthenticatedUser()));
这一步骤是否已在前一个配置中实现?我们需要明确这一点。
此外,我想了解第二项检查是否有助于执行其他自定义验证。例如,访问应用程序不仅需要通过Azure AD验证用户身份,还需要确认用户存在于“用户”表中。这种额外的验证是否可以通过“二次验证”来实现?
身份验证的主要目的是确认用户的身份。如果无法识别用户,系统不会中断,但当用户尝试访问需要身份验证的端点时,系统会返回401错误(未授权)。因此,第一步是确认用户身份,第二步则是确保用户在需要身份验证的地方已通过验证。
若需向策略中添加更多条件,可以创建自定义需求并将其添加到授权策略中。例如:
services.AddAuthorization(o => o.AddPolicy(_RequireAuthenticatedUserPolicy, builder => builder.RequireAuthenticatedUser().AddRequirements(new CustomUserRequirement())));
为此,您需要实现CustomUserRequirement和CustomUserPolicyRequirementHandler来处理这些需求:
public class CustomUserPolicyRequirementHandler : AuthorizationHandler
{
private readonly IUserService _userService;
public CustomUserPolicyRequirementHandler(IUserService userService)
{
_userService = userService;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomUserRequirement requirement)
{
if (!context.HasFailed)
{
if (_userService.DoesUserExistInMyCustomTable(context.User))
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
}
return Task.CompletedTask;
}
}
public class CustomUserRequirement : IAuthorizationRequirement { }
最后,在服务提供者中注册自定义需求处理程序:
services.AddTransient();