C# 如何实现允许承载令牌身份验证或API密钥身份验证的ASP.Net核心API控制器

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密钥,那么它将成功进行身份验证。否,您可以使用一个授权策略来指定不同的身份验证方案,并且使用其中一个方案成功地进行身份验证足以继续,此时将检查授权

我想创建一个Web API,可以使用承载令牌或简单的API密钥访问,有关API密钥,请参阅。我理解如何分别实现这两种方法,但我的问题是如何将Authorize属性应用于允许这两种方法之一的控制器类。我的理解是授权属性是累积的,即如果我同时应用这两个属性,则意味着请求需要一个熊令牌和一个API密钥。我希望它能够正常工作,这样,如果请求具有承载令牌API密钥,那么它将成功进行身份验证。

否,您可以使用一个授权策略来指定不同的身份验证方案,并且使用其中一个方案成功地进行身份验证足以继续,此时将检查授权策略的要求以进行授权

当授权发生时,授权中间件和授权过滤器使用的逻辑如下(稍微简化):

首先,要求对用户进行策略身份验证,然后使用返回的结果对用户进行授权。在策略中,evaluator的工作方式如下:

  • 对于策略中的每个
    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)