C# 如何在Nancy中注入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

我有一个Nancy模块和一个decorator类,需要知道ClaimsPrincipal才能检索用户的电子邮件地址。所以我声明了一个构造函数为

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;
}