【问题标题】:Autofac Getting the current identityAutofac 获取当前身份
【发布时间】:2016-11-25 15:11:59
【问题描述】:

我有一个服务,几乎每个方法都需要当前用户执行。在我开始使用 autofac 之前,我基本上创建了一个这样的公共属性:

private IOrderProvider _orderProvider;

public IOrderProvider OrderProvider => _orderProvider ?? (_orderProvider = new OrderProvider((ClaimsIdentity)User.Identity));

因为这是控制器上的公共属性,所以它可以访问 User。现在使用 autofac 我在 StartupConfig 中注册了我的 Service。自然我无权访问那里的用户

有没有办法将当前用户注入到 OrderProvider 构造函数中,或者另一种方法来实现它?

【问题讨论】:

  • 创建一个服务,包装HttpContext并暴露用户原则或身份。你想要哪个
  • 你能举个例子吗?

标签: c# asp.net-web-api autofac


【解决方案1】:

可以通过HttpContext.Current.User 访问用户主体。如何将代码与 HttpContext 紧密耦合是不受欢迎的,因为它对单元测试不太友好。所以创建一个公开你想要的服务。

using System.Security.Principal;
public interface IPrincipalProvider
{
    IPrincipal User { get; }
}

生产中的实现可能如下所示。

using System.Security.Principal;    
public class DefaultPrincipalProvider : IPrincipalProvider
{
    public IPrincipal User
    {
        get
        {
            return HttpContext.Current.User;
        }
    }
} 

完成后更新依赖类以使用抽象

public class OrderProvider : IOrderProvider
{
    private readonly ClaimsIdentity identity;
    public OrderProvider(IPrincipalProvider provider) {
        identity = (ClaimsIdentity)provider.User.Identity;
    }
}

然后像往常一样在启动时注册提供程序

//...other code removed for brevity

builder.RegisterType<DefaultPrincipalProvider>().As<IPrincipalProvider>();
builder.RegisterType<OrderProvider>().As<IOrderProvider>();

//...other code removed for brevity

服务应该注入所有东西

public class Service {
    private readonly IOrderProvider _orderProvider;

    public Service(IOrderProvider orderProvider) {
        _orderProvider = orderProvider;
    }

    public IOrderProvider OrderProvider => _orderProvider;
}

【讨论】:

  • 有了这个“服务”,是不是也需要注册?然后注入控制器?我假设我必须做类似的事情:private readonly Service _service 然后当我想要订单提供商时我需要做_service.OrderProvider 吗?
  • 是的。我只演示了与访问 IPrinciple 相关的部分。我对您的架构没有完全了解。这只是一个简单的例子。我假设您已经注册了您的服务。
  • 我在谈论您为 orderProvider 提供的包装服务?除非您将其视为控制器?
  • 好的,现在我对你在说什么感到困惑。请澄清。我的示例中的 Service 仅基于您提到的 I have a Service and virtually every method requires the current user to execute
  • 我只添加了用户抽象。其他一切都来自您的原始示例。我将它们包含在答案中只是为了展示它们如何组合在一起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多