不,您可以使用指定不同身份验证方案的单一授权策略,并且使用其中的一个成功进行身份验证就足以继续,此时会检查授权策略的要求以进行授权。
授权发生时,授权中间件和授权过滤器使用的逻辑如下(略简化):
var authenticateResult = await policyEvaluator.AuthenticateAsync(policy, httpContext);
if (HasAllowAnonymous(context))
return;
var authorizeResult = await policyEvaluator.AuthorizeAsync(
policy, authenticateResult, httpContext, context);
if (authorizeResult.Challenged)
// trigger Challenge (401)
else if (authorizeResult.Forbidden)
// trigger Forbid (403)
首先,policy evaluator 被要求对策略的用户进行身份验证,然后使用返回的结果对用户进行授权。策略评估器中的Authentication 工作方式如下:
- 对于策略中的每个
AuthenticationScheme,尝试对用户进行身份验证。
- 对于所有成功的身份验证,将其用户主体合并到一个主体中。
- 如果创建了主体,则策略身份验证成功,即至少一个身份验证成功。
所以在这个过程中,所有的身份验证方案都将用于对用户进行身份验证。它们只能通过一种方案进行身份验证,例如Bearer 和 ApiKey,甚至可以通过多种方案进行身份验证。
然后,策略评估器authorizes 用户,只需调用授权服务authorize the user 对抗policy’s requirements。并且策略要求不包含您构建策略时使用的身份验证方案。
总结一下:不,您传递给 AuthorizationPolicyBuilder 的身份验证方案仅用于身份验证,而不用于授权,它们都将用于潜在地对用户进行身份验证。