ASP.NET Web API 2 通过使用 Autofac 的依赖注入访问当前用户声明

ASP.NET Web API 2 access current user claims via dependency injection with Autofac

目前我必须使用 Topshelf 和 Owin 开发一个自托管 ASP.NET Web API 2。 我将 Autofac 用作 IOC 容器,并使用 JWT 令牌进行 OAuth2 身份验证。

在 .NET Core/.NET 5 web api 中,我可以通过 IHttpContextAccessor.

获得对当前用户声明的 DI 访问权限

如何使用 Autofac 在我的 .NET Framework Web API 中通过 DI 访问用户声明? (我不想在 API 控制器中访问它们,而是在域服务中)。

在您的域层中,创建针对该层的抽象,允许访问这些细节。示例:

public interface IClaimsProvider
{
   TheClaims Claims { get; }
}

在应用程序的启动路径中,创建使用 HttpContext 获取此数据的 IClaimsProvider 的实现。例如:

public sealed class HttpContextClaimsProvider : IClaimsProvider
{
    public MyClaims Claims => // pull claims from HttpContext.Current
}

这个实现可以在Autofac中注册如下:

builder.RegisterType<HttpContextClaimsProvider>().As<IClaimsProvider>()
    .SingleInstance();

虽然@Steven 的 可以在普通的 .NET Web API 2 应用程序中正常工作,但它不适合使用 Owin 的自托管应用程序,因为 HttpContext.Current 总是 NULL 那里。 根据@Steven 的建议解决方案,我能够按如下方式解决问题:

安装 Nuget 包 OwinRequestScopeContext。 将 app.UseRequestScopeContext(); 添加到 Startup.cs。 向 Domain 项目添加一个 IClaimsProvider 接口:

public interface IClaimsProvider
    {
        ClaimsPrincipal UserClaims { get; }
    }

在启动项目中添加实现IClaimsProviderOwinContextClaimsProviderclass:

public class OwinContextClaimsProvider : IClaimsProvider
    {
        public ClaimsPrincipal UserClaims => OwinRequestScopeContext.Current.Environment["server.User"] as ClaimsPrincipal;
    }

使用 Autofac 注册 ClaimsProvider:

builder.RegisterType<OwinContextClaimsProvider>().As<IClaimsProvider>().InstancePerLifetimeScope();

注意:如果没有用户通过身份验证,IClaimsProvider.UserClaims 将是 NULL