我在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
对象中引用的声明对象并返回。
所以我认为声明现在应该在客户端上可用,所以不需要进一步请求,但它实际上向自己发出第二个请求GetProfileDataAsync
方法被调用,并且基于文档:< / p>
只要请求有关用户的声明,就会调用此方法 (例如在令牌创建期间或通过userinfo端点
哪种有意义,但这是否意味着我需要再次调用我的数据库以再次检索客户数据,并重建与我AuthenticateLocalAsync
方法中相同的声明?
如果是这样,在第一个身份验证方法中传回声明的重点是什么?
有人可以解释一下吗?
由于
明
答案 0 :(得分:0)
对GetProfileDataAsync的调用具有ClaimsPrincipal。您在身份验证阶段提出的声明应该在该委托人身上。所以不需要db往返。
如果在那里找不到索赔,这将是一个错误,您应该在问题跟踪器上打开一个问题。