多个认证中间件

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] 端点显式添加一些内容以指示应尝试这两种类型?或者有没有办法全局指定这个?

I've found this, which seems more or less exactly like what I want to achieve, but is unfortunately in Asp.Net Core.

任何正确方向的帮助或推动将不胜感激。

我发现了这个 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",
    });