如何将作用域服务注入到 IClaimsTransformer 的实现中?

How do you inject a scoped service into an implementation of IClaimsTransformer?

ASP.Net 核心允许您使用 IClaimsTransformer 的实现修改 ClaimsPrincipal。我了解到您是这样注册的:

app.UseClaimsTransformation(o => o.Transformer = new MyClaimsTransformer());

但在 MyClaimsTransformer 中,我需要访问我的数据库。我的问题是如何注入或访问在 MyClaimsTransformer 内部提供数据访问的范围服务?

我认为暂时不可能。

可以找到您正在使用的方法的实现here

public static IApplicationBuilder UseClaimsTransformation(this IApplicationBuilder app, Func<ClaimsPrincipal, Task<ClaimsPrincipal>> transform)
{
    if (app == null)
    {
        throw new ArgumentNullException(nameof(app));
    }
    if (transform == null)
    {
        throw new ArgumentNullException(nameof(transform));
    }

    return app.UseClaimsTransformation(new ClaimsTransformationOptions 
    {
        Transformer = new ClaimsTransformer { OnTransform = transform }
    });
}

如你所见,它是一个简单的代理方法,只提供ClaimsTransformationOptions 属性 Transformer.

而当你只得到 ClaimsPrincipal 时,你无法从中获取请求。

可能是您提交了这个问题,但如果不是,您可以跟踪它 here

@dovydas-navickas 的回答中链接的问题现已解决。

在 ASP.NET Core 1.0-RC2 中,接口 IClaimsTransformer was updated to take a ClaimsTransformationContext 提供了一种通过 HttpContext 访问服务的方法。

比如你需要访问内存缓存,可以这样获取

public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
{
    IMemoryCache cache = context.Context.RequestServices.GetService<IMemoryCache>();

    // ... the rest of the implementation.
}