我正在使用 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