IdentityServer4 API使用承载访问令牌重定向到登录



我使用的是Identity Server 4附带的ABP Commercial,并且在访问API端点时遇到问题。

我已经使用ABP配置了一个具有API资源的客户端,并且我能够成功地请求承载访问令牌,并且它包含我期望的范围。

问题是,我似乎无法使用Bearer令牌来访问我的API端点。发生的情况是,我的请求被重定向到默认登录页面,并且API端点没有被命中。

我尝试了许多不同的方法,包括用[Authorize]标记修饰API端点方法。

部分问题是ABP抽象掉了Identity Server的一些内容,因此默认教程(参考资料(似乎并不完全适用。

我会注释掉authorize头,或者在没有授权的情况下创建一个端点。然后在其中放置一个断点,查看ClaimsPrincical(the User(对象是否按预期填充。

或者使用类似这样的代码将用户的内容转储到HTTP响应或日志中。

private void DumpUser(HttpContext context)
{
ClaimsPrincipal user = context.User;
context.Response.WriteAsync("<h3>Identities</h3>");
foreach (ClaimsIdentity identity in user.Identities)
{
context.Response.WriteAsync($"<h4>identity</h4>");
context.Response.WriteAsync($"Name: {user.Identity.Name ?? "null"}<br>");
context.Response.WriteAsync($"Is Authenticated: {user.Identity.IsAuthenticated}<br>");
context.Response.WriteAsync($"AuthenticationType: {user.Identity.AuthenticationType ?? "null"}<br>");
}
context.Response.WriteAsync("<h3>Claims</h3>");
context.Response.WriteAsync(@"<table>");
context.Response.WriteAsync(@"<thead><tr><th>Type</th><th>Value</th><th>Issuer</th></tr></thead>");
foreach (Claim claim in user.Claims)
{
context.Response.WriteAsync($"<tr>");
context.Response.WriteAsync($"<td>{claim.Type}</td>");
context.Response.WriteAsync($"<td>{claim.Value}</td>");
context.Response.WriteAsync($"<td>{claim.Issuer}</td>");
context.Response.WriteAsync($"</tr>");
}
context.Response.WriteAsync($"</table>");
}

然后您可以从启动中轻松地调用此方法。配置方式:

endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync($"<!DOCTYPE html><body>");
await context.Response.WriteAsync("Hello World!");
DumpUser(context);
});

您需要首先隔离问题所在,是身份验证吗?还是授权?API是否获取令牌?它是否可以基于传入令牌创建有效的已验证用户对象?

最新更新