在 Identityserver4 和自定义 AuthorizationHandler 上使用客户端凭据流 User.Identity.isAuthenticated = false

dro*_*ter 5 identityserver4

您好,我正在使用身份服务器 4,我创建了一个使用 client_credentials 保护的客户端

我能够使用 clientid 和密钥检索令牌,根据 jwt.io,访问令牌的过期时间为 3600 秒或(1 小时)

在 net core 2.2 api 上我有一个自定义的 AuthorizationHandler

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ClientCredentialRequirement requirement)
        {

            if (requirement.AllowedClients != null && requirement.AllowedClients.Any()) {

                if (context.User.Identity.IsAuthenticated) { // this is false
                     context.Succeed(requirement);
                            return Task.CompletedTask;
                } 
Run Code Online (Sandbox Code Playgroud)

使用客户端凭据时应该返回 false 吗?我希望它是真的,因为令牌是有效的

dro*_*ter 4

所以我想通了。

事实证明,该应用程序是一个功能齐全的“idserver”加上“mvc 网站”,已经配置了 cookie 身份验证,这一事实给我带来了问题。

对 api 的请求没有声明,因为不使用承载身份验证方案来处理请求。

我必须将其添加到 api 控制器才能使其按预期工作。

[Authorize(AuthenticationSchemes = "Bearer")]
public class MixedController : Controller
Run Code Online (Sandbox Code Playgroud)

详细信息请参见此处

现在,即使使用客户端凭据,User.Identity 声明也会使用令牌中的声明和范围进行填充,并且 User 显示为 Authenticated = true