我正在使用 IdentityServer4,我正在尝试使用访问令牌访问同一服务器上的其他 API 端点,总是收到 401

Posted

技术标签:

【中文标题】我正在使用 IdentityServer4,我正在尝试使用访问令牌访问同一服务器上的其他 API 端点,总是收到 401【英文标题】:I'm using IdentityServer4 and I'm trying to access additional API endpoints on the same server with an Access token, always receiving 401 【发布时间】:2021-11-30 18:51:18 【问题描述】:

我正在使用 .net core 2.2 和 IdentityServer 4,尝试使用访问令牌访问同一服务器上的其他 API 端点,总是收到 401。

Startup.cs

        services.AddLocalApiAuthentication();
        services.AddAuthentication(options =>
        
            options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
        )
        .AddJwtBearer(options =>
        
            options.SaveToken = true;
            options.Authority = "https://localhost:5555";
            options.RequireHttpsMetadata = false;
            options.Audience = LocalApi.ScopeName;
        );

        services.AddIdentityServer(options =>
        
            options.Caching.ClientStoreExpiration = TimeSpan.FromMinutes(10);
            options.Caching.ResourceStoreExpiration = TimeSpan.FromMinutes(10);
            options.Caching.CorsExpiration = TimeSpan.FromMinutes(10);
            options.IssuerUri = "https://localhost:5555";
        );

配置:

        app.UseHttpsRedirection();
        app.UseIdentityServer();
        app.UseAuthentication();
        app.UseMvc(routes =>
        
            routes.MapRoute(
                name: "default",
                template: "controller/action=Index/id?");
        );

端点:

    [HttpGet]
    [Route("v1/info")]
    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Policy = LocalApi.PolicyName)]
    public async Task<ActionResult> GetAccountInfo()

结果:

  info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1]
     Authorization was successful.
  info: Microsoft.AspNetCore.Mvc.StatusCodeResult[1]
     Executing HttpStatusCodeResult, setting HTTP status code 401

更新

API 向 IdentityServer 请求访问令牌以访问 IdentityServer 自定义端点 API。 尝试访问通过身份验证的 IdentityServer 端点 api 时 这个收到的访问令牌,我收到 401

【问题讨论】:

我们错过了app.UseAuthorization();这件作品吗? @GordonKhanhNg。它在我的版本中不存在 【参考方案1】:

查看源代码后,似乎AddLocalApiAuthentication 方法使用了自己的身份验证方案,我们可以看到here 和here。

所以,如果我们想保持默认身份验证方案为IdentityServerAuthenticationDefaults.AuthenticationScheme,只需保留启动配置并将操作端点更改为[Authorize(AuthenticationSchemes = IdentityServerConstants.LocalApi.AuthenticationScheme, Policy = IdentityServerConstants.LocalApi.ScopeName)]

但我只是好奇......如果我是对的,这个配置是在我们的身份提供者服务上,那么为什么它应该接受来自其他身份提供者的 Jwt 令牌,因为我们像这样配置它

services.AddAuthentication(options =>
        
            options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
        )
        .AddJwtBearer(options =>
        
            options.SaveToken = true;
            options.Authority = "https://localhost:5555"; // Other Identity provider here
            options.RequireHttpsMetadata = false;
            options.Audience = LocalApi.ScopeName;
        );

这有什么特别的原因吗?因为 AFAIK,AddLocalApiAuthentication 的创建包含身份提供者以接受它自己的凭据,而不是来自其他人的凭据。

更新

我只是看看你的链接...可能替换 API 1 因为 Client 可能更合适。

只需像这样更改配置

// Startup.cs
public void ConfigureServices(IServiceCollection services)

    // Some registers...
    services.AddLocalApiAuthentication();
    // No need for services.AddAuthentication(...).AddJwtBearer(...);
    services.AddIdentityServer(); // This one take care of all the AddAuthentication stuff.
    // Some registers...


public void Configure(IApplicationBuilder app)

    // Some registers...
    app.UseAuthentication();
    // Some registers...


// Controller
[HttpGet]
[Route("v1/info")]
[Authorize] // This should be enough, and in case it's still 401, try beblow
//[Authorize(AuthenticationSchemes = IdentityServerConstants.LocalApi.AuthenticationScheme, Policy = IdentityServerConstants.LocalApi.ScopeName)]
public async Task<ActionResult> GetAccountInfo()

确保将带有Authorization 标头格式的令牌附加为Bearer eyskeu...。这适用于 .net 3.1,我暂时没有 2.x 版本

【讨论】:

我没有其他身份提供者,我将解释我想要做什么: 1- 我已从我的 IdentityServer 请求一个访问令牌以让我的 API 访问我的 IdentityServer。 * API -> (Client Credentials) IdentityServer -- 收到访问令牌 * API -> (访问令牌) 到 IdentityServer 上的端点 api 我在你的更新中看到了...希望更新版本回答帮助。

以上是关于我正在使用 IdentityServer4,我正在尝试使用访问令牌访问同一服务器上的其他 API 端点,总是收到 401的主要内容,如果未能解决你的问题,请参考以下文章

gRPC IdentityServer4 错误:无法使用 google auth 登录

在 IdentityServer4 和 Dotnet Core Identity 中使用带有身份验证 (oidc) 的 sms otp

IdentityServer4 Ws 联合声明

IdentityServer4具有没有UI的LDAP / AD身份验证

IdentityServer4 管理界面

使用 IdentityServer4 时出现“需要代码挑战”