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; }
}
在启动项目中添加实现IClaimsProvider
的OwinContextClaimsProvider
class:
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
。
目前我必须使用 Topshelf 和 Owin 开发一个自托管 ASP.NET Web API 2。 我将 Autofac 用作 IOC 容器,并使用 JWT 令牌进行 OAuth2 身份验证。
在 .NET Core/.NET 5 web api 中,我可以通过 IHttpContextAccessor
.
如何使用 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 的 HttpContext.Current
总是 NULL
那里。
根据@Steven 的建议解决方案,我能够按如下方式解决问题:
安装 Nuget 包 OwinRequestScopeContext。
将 app.UseRequestScopeContext();
添加到 Startup.cs
。
向 Domain 项目添加一个 IClaimsProvider
接口:
public interface IClaimsProvider
{
ClaimsPrincipal UserClaims { get; }
}
在启动项目中添加实现IClaimsProvider
的OwinContextClaimsProvider
class:
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
。