C# 多重认证中间件

C# 多重认证中间件,c#,asp.net,authentication,identityserver3,authorize-attribute,C#,Asp.net,Authentication,Identityserver3,Authorize Attribute,你好 我正在将API从使用转移到: app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 要验证令牌,请使用IdentityServer 但是,我希望也能够使用上述中间件验证之前发布的任何令牌 因此,首先我将上面的行替换为以下内容(IdentityServer3.AccessTokenValidation): 这可以正常工作并正确授权对受保护端点的请求,但仅适用于IdentityServer发出的令

你好

我正在将API从使用转移到:

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 
要验证令牌,请使用IdentityServer

但是,我希望也能够使用上述中间件验证之前发布的任何令牌

因此,首先我将上面的行替换为以下内容(IdentityServer3.AccessTokenValidation):

这可以正常工作并正确授权对受保护端点的请求,但仅适用于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中间件总是尝试验证令牌的中间件,一旦失败,它似乎永远不会尝试“遗留”OAuth中间件

我是否需要向所有[Authorize]端点显式添加一些内容,以指示应该尝试这两种类型?或者有没有一种方法可以全局地指定这一点

如果您能向正确的方向提供帮助或推动,我们将不胜感激。

我发现了这一点,他们建议从IdentityServerBearerTokenAuthenticationOptions中删除所需的作用域。我试过了,它开始起作用了。 因此,本质上:

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

我照你说的做了。请求的响应是正确的,但它在日志文件中写入idx10501错误。
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
    {
        AuthenticationType = "BearerLegacy",
    })
    .UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
    {
        Authority = WebConfigurationManager.AppSettings["AuthServer"],
        AuthenticationType = "BearerIdSrv",
        ClientId = "TabletAPI",
        ClientSecret = "secret",
    });