IdentityServer return 是否可以声明为身份验证请求的一部分

Can IdentityServer return claims as part of authenticate request

我在 Thinktecture IdentityServer 之上使用 wsfederation 插件实现 wsfed 身份验证,我使用如下所示的 AuthenticateLocalAsync 方法实现了自己的 UserService

public async Task<AuthenticateResult> AuthenticateLocalAsync(string username, string password, SignInMessage message)
        {
            var requestViewModel = new SignInRequestViewModel
                              {
                                  EmailAddress = username,
                                  Password = password
                              };

            var result = await signInApplicationService.SignInAsync(requestViewModel);

            var responseViewModel = result.ViewModel;

            var claims = claimBuilder.GetClaims(responseViewModel);

            return new AuthenticateResult(
                responseViewModel.CustomerId.ToString(),
                string.Format("{0} {1}", responseViewModel.FirstName, responseViewModel.LastName),
                claims);
        }

当登录事件触发时调用此方法,如您所见,我根据自己的数据库存储库对用户进行了身份验证,然后根据结果我建立了在 AuthenticateResult 对象和 [=32] 中引用的声明对象=] 返回.

所以我认为索赔现在应该在客户端可用,所以不需要进一步请求,但它实际上向自己发出第二次请求,调用 GetProfileDataAsync 方法,并基于文档:

This method is called whenever claims about the user are requested (e.g. during token creation or via the userinfo endpoint

这有点道理,但这是否意味着我需要再次调用我的数据库以再次检索客户数据,并像我在 AuthenticateLocalAsync 方法中所做的那样重建声明?

如果是这样,在第一个身份验证方法中传回声明有什么意义?

有人可以解释一下吗?

谢谢

对 GetProfileDataAsync 的调用有一个 ClaimsPrincipal。您在身份验证阶段提出的声明应该针对该主体。所以不需要数据库往返。

如果在那里找不到声明,这将是一个错误,您应该在问题跟踪器上打开一个问题。