我正在使用Identity Server 4随附的ABP Commercial,但是在允许访问API端点时遇到问题。
我已经使用ABP来配置具有API资源的客户端,并且能够成功请求Bearer访问令牌,并且其中包含我期望的范围。
问题是我似乎无法使用Bearer令牌来访问我的API端点。发生了什么事,我的请求被重定向到默认登录页面,而API端点未命中。
我尝试了许多不同的方法,包括使用[Authorize]
标签装饰API端点方法。
部分问题是ABP提取了一些Identity Server内容,因此默认教程(reference)似乎并不完全适用。
答案 0 :(得分:1)
我会注释掉授权标头或创建未经授权的端点。然后在其中放置一个断点,以查看是否按预期填充了ClaimsPrincial(用户)对象。
或者使用类似这样的代码将用户的内容转储到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>");
}
然后,您可以轻松地在startup.Configure方法中调用此方法:
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync($"<!DOCTYPE html><body>");
await context.Response.WriteAsync("Hello World!");
DumpUser(context);
});
您需要首先找出问题所在,这是身份验证吗?还是授权? API是否获得令牌,并且可以基于传入令牌创建有效的经过身份验证的用户对象?