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

时间:2020-07-27 16:59:34

标签: identityserver4 abp

我正在使用Identity Server 4随附的ABP Commercial,但是在允许访问API端点时遇到问题。

我已经使用ABP来配置具有API资源的客户端,并且能够成功请求Bearer访问令牌,并且其中包含我期望的范围。

问题是我似乎无法使用Bearer令牌来访问我的API端点。发生了什么事,我的请求被重定向到默认登录页面,而API端点未命中。

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

部分问题是ABP提取了一些Identity Server内容,因此默认教程(reference)似乎并不完全适用。

1 个答案:

答案 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是否获得令牌,并且可以基于传入令牌创建有效的经过身份验证的用户对象?