gpt4 book ai didi

performance - IdentityServer4调用过多导致性能问题

转载 作者:行者123 更新时间:2023-12-02 00:44:20 25 4
gpt4 key购买 nike

我正在实现一个自定义用户存储,其中我的用户提供者位于一个单独的服务中,我使用消息传递来联系该服务。

问题是 GetProfileDataAsyncIsActiveAsync 被调用次数过多(各约 3 次),导致每次都启动消息传递进程。

这是 IProfileService 的简单实现。

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;
}
}

我的问题是:

有没有办法最大限度地减少这些调用的数量?或者我可以检查一些存在的信息,这意味着无需再次调用 _userManager.FindBySubjectIdAsync 吗?

最佳答案

配置文件服务不会被调用太多次,但会在不同的上下文中被多次调用:

  • 对于访问 token Context.Caller = ClaimsProviderAccessToken。
  • 对于身份 token Context.Caller = UserInfoEndpoint。

每个调用者都期望不同的结果。这就是为什么您应该按请求的声明类型过滤声明:

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不同的声明。

您可以通过不向访问端点以外的其他端点请求信息来最大程度地减少调用。但您也可以检查调用者并针对每个调用者采取不同的操作。您还可以赋予 token 更长的生命周期,这样您就不需要经常刷新 token 。

关于performance - IdentityServer4调用过多导致性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48006060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com