C# 如何实现允许承载令牌身份验证或API密钥身份验证的ASP.Net核心API控制器
我想创建一个Web API,可以使用承载令牌或简单的API密钥访问,有关API密钥,请参阅。我理解如何分别实现这两种方法,但我的问题是如何将Authorize属性应用于允许这两种方法之一的控制器类。我的理解是授权属性是累积的,即如果我同时应用这两个属性,则意味着请求需要一个熊令牌和一个API密钥。我希望它能够正常工作,这样,如果请求具有承载令牌或API密钥,那么它将成功进行身份验证。否,您可以使用一个授权策略来指定不同的身份验证方案,并且使用其中一个方案成功地进行身份验证足以继续,此时将检查授权策略的要求以进行授权 当授权发生时,授权中间件和授权过滤器使用的逻辑如下(稍微简化): 首先,要求对用户进行策略身份验证,然后使用返回的结果对用户进行授权。在策略中,evaluator的工作方式如下:C# 如何实现允许承载令牌身份验证或API密钥身份验证的ASP.Net核心API控制器,c#,asp.net,asp.net-core,asp.net-web-api,C#,Asp.net,Asp.net Core,Asp.net Web Api,我想创建一个Web API,可以使用承载令牌或简单的API密钥访问,有关API密钥,请参阅。我理解如何分别实现这两种方法,但我的问题是如何将Authorize属性应用于允许这两种方法之一的控制器类。我的理解是授权属性是累积的,即如果我同时应用这两个属性,则意味着请求需要一个熊令牌和一个API密钥。我希望它能够正常工作,这样,如果请求具有承载令牌或API密钥,那么它将成功进行身份验证。否,您可以使用一个授权策略来指定不同的身份验证方案,并且使用其中一个方案成功地进行身份验证足以继续,此时将检查授权
AuthenticationScheme
,尝试对用户进行身份验证承载
和ApiKey
,或者甚至可以通过多个方案进行身份验证
然后,策略评估器通过简单地调用授权服务来评估用户。并且策略要求不包含构建策略时使用的身份验证方案
总之:不,您传递给AuthorizationPolicyBuilder的身份验证方案仅用于身份验证,而不用于授权,它们都将用于潜在地对用户进行身份验证
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)