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())));
添加 CustomUserRequirement 和 CustomUserPolicyRequirementHandler 来处理需求
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>();
我使用 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())));
添加 CustomUserRequirement 和 CustomUserPolicyRequirementHandler 来处理需求
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>();