gpt4 book ai didi

asp.net-core - 如何从 ISecurityTokenValidator 正确获取依赖范围的服务

转载 作者:行者123 更新时间:2023-12-04 11:04:09 26 4
gpt4 key购买 nike

在我的 asp.net core 2.0 web 应用程序中,我有一个自定义 ISecurityTokenValidator验证 token 。

它依赖于存储库来进行数据库查找 - 存储库本身被设置为作用域依赖项:

services.AddScoped<IMyRepository>(MyRepository);

现在,由于 ISecurityTokenValidator 的设置方式而出现了时髦。

已添加到 ConfigureServices :
.AddJwtBearer(options =>
{
options.SecurityTokenValidators.Clear();
options.SecurityTokenValidators.Add(new MyTokenValidator(services.BuildServiceProvider()));
})

这是它的外观:
public class MyTokenValidator : ISecurityTokenValidator
{
private readonly IServiceProvider _serviceProvider;

public MyTokenValidator(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}

public bool CanReadToken(string securityToken) => true;

public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters,
out SecurityToken validatedToken)
{

var serviceScopeFactory = _serviceProvider.GetRequiredService<IServiceScopeFactory>();

using (var scope = serviceScopeFactory.CreateScope())
{
var myRepository = scope.ServiceProvider.GetService<IMyRepository>();
var principalFactory = scope.ServiceProvider.GetService<IUserClaimsPrincipalFactory<User>>();

// Use the repo....

}

}
}

现在,因为 IsecurityTokenProvider只实例化一次,它实际上是一个单例。当我使用服务提供商要求 IMyRepository我发现我总是收到相同的对象 - 就它而言没有新的范围,因为它在单例类中。

为了解决这个问题,您将在上面的代码中看到,每次调用 token 验证器时,我都必须手动强制一个新的范围。这真的是解决这个问题的唯一方法吗,似乎我正在四处寻找让它在这里工作......

最佳答案

老问题,但我发现解决此问题的最佳方法是使用 IPostConfigureOptions<JwtBearerOptions>配置 SecurityTokenValidators。

首先注册 JWT 承载和选项

        services.AddAuthentication(options =>
{
...
}).AddJwtBearer(AuthenticateScheme, options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
...
};
});

然后注册 IPostConfigureOptions<JwtBearerOptions> 的自定义实现
    services.AddSingleton<IPostConfigureOptions<JwtBearerOptions>, CustomJwtBearerOptionsPostConfigureOptions>();

并注册 ISecurityTokenValidator 的自定义实现
    services.AddSingleton<MyCustomSecurityTokenValidator>();

CustomJwtBearerOptionsPostConfigureOptions 可能类似于:
public class CustomJwtBearerOptionsPostConfigureOptions : IPostConfigureOptions<JwtBearerOptions>
{
private readonly MyCustomSecurityTokenValidator _tokenValidator; //example dependancy

public CustomJwtBearerOptionsPostConfigureOptions(MyCustomSecurityTokenValidator tokenValidator)
{
_tokenValidator = tokenValidator;
}

public void PostConfigure(string name, JwtBearerOptions options)
{
options.SecurityTokenValidators.Clear();
options.SecurityTokenValidators.Add(_tokenValidator);
}
}

现在 options.SecurityTokenValidators 由 CustomJwtBearerOptionsPostConfigureOptions 配置它是通过依赖注入(inject)实例化的,并且可以传递相关的规范。

关于asp.net-core - 如何从 ISecurityTokenValidator 正确获取依赖范围的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58804132/

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