如何在同一操作中支持多个 Bearer 令牌处理程序?

How do I support multiple Bearer token handlers on the same action?

我有一个应用程序已经实现了 OAuth(某种程度上)。我们正在迁移到使用 Identity Server 进行 OAuth,我现在需要在某些 Controllers/Actions.

上支持这两种身份验证方案

每种身份验证方法的不记名令牌明显不同。一个是 guid,另一个是 Identity Server 生成的正确令牌。

我只需要一些方法来查看令牌并说出字符串长度 <= 36 的任何内容都应该是旧方法。更多使用 Identity Server。

根控制器有一个基本的 [Authorize] 属性。此外,如果我切换方案的第一个列出的作品的顺序。

这是我的 Startup.cs 代码

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = Constants.CompanyBearerScheme;
            options.DefaultChallengeScheme = Constants.CompanyBearerScheme;
        }).AddJwtBearer(options =>
        {
            options.Authority = "https://identityserverurl";
            options.Audience = "APISCOPE";
            options.RequireHttpsMetadata = true;
        }).AddBearerToken(Constants.CompanyBearerScheme, o =>
        {
            o.ConnectionString = bearerTokenHandlerOptions.ConnectionString;
            o.DefaultScopes = bearerTokenHandlerOptions.DefaultScopes;
        })

示例操作

    [Authorize(AuthenticationSchemes = "CompanyBearer,Bearer")]
    [HttpGet("TEST")]
    public async Task<IActionResult> TestAuthentication()
    {
    return Ok();
    }

样品申请

GET {{Url}}/Api/TEST
Authorization: Bearer SOMETOKEN

我想通了。

需要使用自定义策略方案来比较传入请求。

 services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = Constants.DefaultSelectorPolicy;
            options.DefaultChallengeScheme = Constants.DefaultSelectorPolicy;
        })
        .AddPolicyScheme(Constants.DefaultSelectorPolicy, Constants.DefaultSelectorPolicy, options =>
        {
            options.ForwardDefaultSelector = ctx =>
            {
                if (!ctx.Request.Headers.ContainsKey("Authorization"))
                {
                    return null;
                }

                var authorizationHeader = ctx.Request.Headers["Authorization"];

                var authorization = AuthenticationHeaderValue.Parse(authorizationHeader);

                if (authorization.Scheme.ToLower() != "bearer")
                {
                    return null;
                }

                if (authorization.Parameter.Length > 36)
                {
                    return "Bearer";
                }

                return Constants.CompanyBearerScheme;
            };
        })