【问题标题】:How do I support multiple Bearer token handlers on the same action?如何在同一操作上支持多个 Bearer 令牌处理程序?
【发布时间】:2019-09-30 18:35:18
【问题描述】:

我有一个应用程序具有 OAuth 的现有实现(有点)。我们正在迁移到使用 Identity Server 进行 OAuth,我现在需要在某些控制器/操作上同时支持这两种身份验证方案。

每种身份验证方法的不记名令牌明显不同。一个是 guid,另一个是 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

【问题讨论】:

  • 嗨,如果你弄明白了,你可以把它作为答案发布,因为它让将来有类似问题的人知道已经有一个答案:)。见stackoverflow.com/help/self-answer

标签: asp.net-core-2.0 asp.net-authorization


【解决方案1】:

我想通了。

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

 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;
            };
        })

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 2017-08-14
    • 2021-03-02
    • 2021-03-29
    • 2012-07-25
    • 2021-02-24
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多