多个认证中间件
Multiple Authentication Middlewares
美好的一天
我正在将 API 从使用中移出:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
为了验证令牌,使用 IdentityServer。
不过,我还希望能够使用上述中间件验证之前发布的任何令牌。
所以一开始我用下面的 (IdentityServer3.AccessTokenValidation) 替换了上面的行:
.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "http://localhost:5000",
RequiredScopes = new[] { "api.tablet" },
ClientId = "TabletAPI",
ClientSecret = "secret",
});
这有效并正确授权了对受保护端点的请求,但仅限于 IdentityServer 颁发的令牌。
所以我相信我在 IdentityServer 中的设置很好,因为使用了经过正确验证并允许访问的参考令牌。
但是我希望旧的 OAuth 令牌也得到验证,因此支持旧的 OAuth 令牌以及我的 IdentityServer 发布的任何 JwT 或参考令牌。
我找到的方法(如果有更好的方法请告诉我)是将两个中间件都添加到管道中,如下所示:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
AuthenticationType = "BearerLegacy",
})
.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = WebConfigurationManager.AppSettings["AuthServer"],
RequiredScopes = new[] { "api.tablet" },
AuthenticationType = "BearerIdSrv",
ClientId = "TabletAPI",
ClientSecret = "secret",
});
这是我被卡住了,似乎 IdentityServer 中间件总是尝试验证令牌,一旦失败,它似乎永远不会尝试 "legacy" OAuth 中间件。
我是否需要向我的所有 [Authorize] 端点显式添加一些内容以指示应尝试这两种类型?或者有没有办法全局指定这个?
任何正确方向的帮助或推动将不胜感激。
我发现了这个 link,他们建议从 IdentityServerBearerTokenAuthenticationOptions 中删除 RequiredScopes。我试过了,它开始工作了。
所以本质上是这样的:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
AuthenticationType = "BearerLegacy",
})
.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = WebConfigurationManager.AppSettings["AuthServer"],
RequiredScopes = new[] { "api.tablet" },
AuthenticationType = "BearerIdSrv",
ClientId = "TabletAPI",
ClientSecret = "secret",
});
需要变成这样:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
AuthenticationType = "BearerLegacy",
})
.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = WebConfigurationManager.AppSettings["AuthServer"],
AuthenticationType = "BearerIdSrv",
ClientId = "TabletAPI",
ClientSecret = "secret",
});
美好的一天
我正在将 API 从使用中移出:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
为了验证令牌,使用 IdentityServer。
不过,我还希望能够使用上述中间件验证之前发布的任何令牌。
所以一开始我用下面的 (IdentityServer3.AccessTokenValidation) 替换了上面的行:
.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "http://localhost:5000",
RequiredScopes = new[] { "api.tablet" },
ClientId = "TabletAPI",
ClientSecret = "secret",
});
这有效并正确授权了对受保护端点的请求,但仅限于 IdentityServer 颁发的令牌。 所以我相信我在 IdentityServer 中的设置很好,因为使用了经过正确验证并允许访问的参考令牌。
但是我希望旧的 OAuth 令牌也得到验证,因此支持旧的 OAuth 令牌以及我的 IdentityServer 发布的任何 JwT 或参考令牌。
我找到的方法(如果有更好的方法请告诉我)是将两个中间件都添加到管道中,如下所示:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
AuthenticationType = "BearerLegacy",
})
.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = WebConfigurationManager.AppSettings["AuthServer"],
RequiredScopes = new[] { "api.tablet" },
AuthenticationType = "BearerIdSrv",
ClientId = "TabletAPI",
ClientSecret = "secret",
});
这是我被卡住了,似乎 IdentityServer 中间件总是尝试验证令牌,一旦失败,它似乎永远不会尝试 "legacy" OAuth 中间件。
我是否需要向我的所有 [Authorize] 端点显式添加一些内容以指示应尝试这两种类型?或者有没有办法全局指定这个?
任何正确方向的帮助或推动将不胜感激。
我发现了这个 link,他们建议从 IdentityServerBearerTokenAuthenticationOptions 中删除 RequiredScopes。我试过了,它开始工作了。 所以本质上是这样的:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
AuthenticationType = "BearerLegacy",
})
.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = WebConfigurationManager.AppSettings["AuthServer"],
RequiredScopes = new[] { "api.tablet" },
AuthenticationType = "BearerIdSrv",
ClientId = "TabletAPI",
ClientSecret = "secret",
});
需要变成这样:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
AuthenticationType = "BearerLegacy",
})
.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = WebConfigurationManager.AppSettings["AuthServer"],
AuthenticationType = "BearerIdSrv",
ClientId = "TabletAPI",
ClientSecret = "secret",
});