【问题标题】:ASP.NET Web API 2 access current user claims via dependency injection with AutofacASP.NET Web API 2 通过 Autofac 的依赖注入访问当前用户声明
【发布时间】:2021-08-09 13:29:04
【问题描述】:

目前我必须使用 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 控制器中访问它们,而是在域服务中)。

【问题讨论】:

    标签: c# asp.net dependency-injection asp.net-web-api2 autofac


    【解决方案1】:

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

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

    public interface IClaimsProvider
        {
            ClaimsPrincipal UserClaims { get; }
        }
    

    在启动项目中添加一个实现IClaimsProviderOwinContextClaimsProvider 类:

    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

    【讨论】:

      【解决方案2】:

      在您的领域层中,创建一个与该层相关的抽象,允许访问这些详细信息。示例:

      public interface IClaimsProvider
      {
         TheClaims Claims { get; }
      }
      

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

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

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

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

      【讨论】:

      • 感谢您的回答。不幸的是,HttpContext.Current 始终为空。
      猜你喜欢
      • 2019-02-25
      • 1970-01-01
      • 2018-03-24
      • 2017-10-22
      • 2013-12-04
      • 2014-09-30
      • 2017-12-25
      • 2018-12-16
      • 1970-01-01
      相关资源
      最近更新 更多