多个身份验证中间件



Good Day

我正在将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令牌也得到验证,因此支持旧的OAauth令牌以及由我的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中间件似乎总是试图验证令牌的,一旦失败,它似乎永远不会尝试"遗留"OAuth中间件。

我是否需要明确地向我的所有[授权]端点添加一些内容,以指示应该尝试这两种类型?或者有没有一种方法可以在全局范围内指定这一点?

我发现了这一点,这似乎或多或少与我想要实现的目标完全一样,但不幸的是,它是在Asp.Net核心中。

如有任何帮助或推动,我们将不胜感激。

我找到了这个链接,他们建议从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",
});

最新更新