AddAuthentication + RequireAuthenticatedUser = 冗余?

AddAuthentication + RequireAuthenticatedUser = redundant?

我使用 Azure Active Directory 对我的用户进行身份验证:

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
    .AddAzureADBearer(options => this.Configuration.Bind("AzureAd", options));

我看过here, in subsection "Authorization for specific endpoints",应该加上RequireAuthenticatedUser

services.AddAuthorization(o => o.AddPolicy(_RequireAuthenticatedUserPolicy,
    builder => builder.RequireAuthenticatedUser()));

但是,上一步不是已经执行了吗?

我想知道第二次检查是否对执行其他类型的自定义检查有用。例如:要访问我的应用程序,我需要使用 AzureAD 对用户进行身份验证,并且 他们应该包含在我的用户 table 中。我可以使用这个 "second authentication" 来执行这个检查吗?

身份验证将尝试找出您的身份,如果不能,它不会中断。但是,如果您尝试到达需要经过身份验证的用户的端点, 它会告诉您它无法验证您的身份 (401)。所以要回答你的问题,第一步会弄清楚你是谁,第二步会告诉你在系统中的什么地方需要进行身份验证。

如果您想向政策添加更多要求,您可以创建自己的自定义要求并将其添加到政策。

这是一个例子:

services.AddAuthorization(o => o.AddPolicy(_RequireAuthenticatedUserPolicy,
    builder => builder.RequireAuthenticatedUser().AddRequirements(new CustomUserRequirement())));

添加 CustomUserRequirementCustomUserPolicyRequirementHandler 来处理需求

public class CustomUserPolicyRequirementHandler : AuthorizationHandler<CustomUserRequirement>
{
    private readonly IUserService _userService;

    public MeetingsPolicyRequirementHandler(
        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 { }

然后在您的服务提供商上注册 CustomUserRequirement 处理程序

services.AddTransient<IAuthorizationHandler, CustomUserPolicyRequirementHandler>();