我正在实现一个自定义用户商店,我的用户提供商住在一个单独的服务中,我正在使用消息传递。
事情是 services.AddMvc(
config =>
{
config.Filters.Add(typeof(CustomExceptionFilter));
}
);
和GetProfileDataAsync
被调用太多次(每次约3次),导致每次都启动消息传递过程。
以下是IProfileService的简单实现。
IsActiveAsync
我的问题是:
有没有办法减少这些电话的数量?或者我可以检查一些信息是否存在意味着无需再次呼叫public class IdentityProfileService : IProfileService
{
private readonly UserManager<ApplicationUser> _userManager;
public IdentityProfileService (UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var user = await _userManager.FindBySubjectIdAsync(context.Subject.GetSubjectId());
if (user != null)
{
context.IssuedClaims = user.Claims;
}
}
public async Task IsActiveAsync(IsActiveContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
context.IsActive = user != null;
}
}
?
答案 0 :(得分:3)
配置文件服务的调用次数不会太多次,但会使用不同的上下文多次调用它:
每个来电者都期望得到不同的结果。这就是您应该按照请求的声明类型过滤声明的原因:
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
var principal = await _claimsFactory.CreateAsync(user);
var claims = principal.Claims.Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList();
context.IssuedClaims = claims;
}
这就是为什么access_token包含与identity_token不同的声明。
您可以通过不从访问端点请求来自其他端点的信息来最小化呼叫。但您也可以检查呼叫者,并为每个呼叫者采取不同的行动。您还可以为令牌提供更长的生命周期,因此您无需刷新该令牌。