【问题标题】:How to implement an ASP.Net Core API Controller which allows Bearer Token authentication OR api key authentication如何实现允许承载令牌身份验证或 api 密钥身份验证的 ASP.Net 核心 API 控制器
【发布时间】:2020-04-19 10:24:26
【问题描述】:

我想创建一个 Web API,可以使用 Bearer 令牌简单的 API 密钥访问,API 密钥请参阅https://gist.github.com/GeorgDangl/87db6426962bf50933b093e0952570e1。我了解如何单独实现这两种方法,但是我的问题是如何将 Authorize 属性应用于允许这些方法中的任何一种的控制器类。我的理解是 Authorize 属性是累积的,即如果我同时应用这两个属性,则意味着请求需要 Bear 令牌 AND API 密钥。我希望它能够工作,以便如果请求具有承载令牌 OR API 密钥,那么它会成功进行身份验证。

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-web-api


    【解决方案1】:

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

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

    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 工作方式如下:

    1. 对于策略中的每个AuthenticationScheme,尝试对用户进行身份验证。
    2. 对于所有成功的身份验证,将其用户主体合并到一个主体中。
    3. 如果创建了主体,则策略身份验证成功,即至少一个身份验证成功。

    所以在这个过程中,所有的身份验证方案都将用于对用户进行身份验证。它们只能通过一种方案进行身份验证,例如BearerApiKey,甚至可以通过多种方案进行身份验证。

    然后,策略评估器authorizes 用户,只需调用授权服务authorize the user 对抗policy’s requirements。并且策略要求不包含您构建策略时使用的身份验证方案。

    总结一下:不,您传递给 AuthorizationPolicyBuilder 的身份验证方案仅用于身份验证,而不用于授权,它们都将用于潜在地对用户进行身份验证。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 2017-09-13
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多