C# 如何在Nancy中注入ClaimsPrincipal
我有一个Nancy模块和一个decorator类,需要知道ClaimsPrincipal才能检索用户的电子邮件地址。所以我声明了一个构造函数为C# 如何在Nancy中注入ClaimsPrincipal,c#,nancy,simple-injector,C#,Nancy,Simple Injector,我有一个Nancy模块和一个decorator类,需要知道ClaimsPrincipal才能检索用户的电子邮件地址。所以我声明了一个构造函数为 public EmailDecorator(IDbConnectionFactory connectionFactory, IPrincipal principal, IEmailClient emailClient) : base(connectionFactory
public EmailDecorator(IDbConnectionFactory connectionFactory,
IPrincipal principal,
IEmailClient emailClient) : base(connectionFactory)
我正在努力弄清楚的是如何将主体注入构造函数。我使用简单的注射器进行DI,它非常有效。但是如果我重写ConfigureRequestContainer()
方法来实例化IPrincipal
,我会得到一个异常
protected override void ConfigureRequestContainer(
TinyIoCContainer container, NancyContext context)
{
container.Register<IPrincipal>((c, o) => context.CurrentUser);
base.ConfigureRequestContainer(container, context);
}
除了请求容器是TinyIoCContainer,我使用的是SimpleInjector。那么,也许我可以添加一个SimpleInjector注册,将解析卸载到请求容器中
_container.RegisterSingleton<Func<IPrincipal>>(() => nancy.Resolve<Func<IPrincipal>>());
\u container.RegisterSingleton(()=>nancy.Resolve());
实际上不,nancy
与请求容器不是同一个容器。因此,也许某个地方有一个容器可以成功地解析IPrincipal,但我不知道如何访问它。练习的目的是避免必须修改回购代码的方法签名以包含ClaimsPrincipal,就像过去可以调用Thread.CurrentPrincipal
一样。仍在寻找线索,但将开始修改方法签名以包含ClaimsPrincipal。答案是使用。在Startup.cs中,在ConfigureServices()
方法中添加新的服务定义:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IAppSettings>(settings);
services.AddSingleton<IHttpContextAccessor>(new HttpContextAccessor());
…
}
在引导程序类ApplicationStartup()
方法中,在简单注入器容器中注册服务:
public Bootstrapper(IHostingEnvironment env, ILogger log, IServiceProvider services)
{
_env = env;
_log = log;
_services = services;
}
…
_container.Register<IHttpContextAccessor>(() =>
(IHttpContextAccessor) _services.GetService(typeof(IHttpContextAccessor)));
ClaimsPrincipal
可以从_httpContextAccessor.HttpContext属性访问。我对Nancy的经验太少,无法立即回答您的问题,但是如果您可以链接到Github上可以在本地运行的最小工作示例,我可以为您解决这个问题。我不知道这个简单的注入器的事情,但是,您的代码使用微小的IoC作为请求容器。可能您在错误的容器中注册了主体。我也不确定该索赔是否能够尽早解决,以便您进行登记。看看这个讨论,它是基于Nancy 1.x(IUserIdentity而非Principal)的,但应该是相关的:是的,我发现自己在兜圈子。ConfigureRequestContainer
中的NancyContext包含ClaimsPrincipal
,但我无法从SImple Injector访问请求容器。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IAppSettings settings)
{
var log = ConfigureLogger(settings);
app.UseOwin(buildFunc =>
{
buildFunc.UseMonitoringAndLogging(log, HealthCheckAsync);
buildFunc.UseNancy(cfg =>
cfg.Bootstrapper = new Bootstrapper(env, log, app.ApplicationServices));
});
}
public Bootstrapper(IHostingEnvironment env, ILogger log, IServiceProvider services)
{
_env = env;
_log = log;
_services = services;
}
…
_container.Register<IHttpContextAccessor>(() =>
(IHttpContextAccessor) _services.GetService(typeof(IHttpContextAccessor)));
public EmailDecorator(IDbConnectionFactory connectionFactory,
ILogger log,
IHttpContextAccessor httpContextAccessor,
IEmailClient emailClient) : base(connectionFactory, log)
{
_emailClient = emailClient;
_httpContextAccessor = httpContextAccessor;
}