如何在同一操作中支持多个 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;
};
})
我有一个应用程序已经实现了 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;
};
})