如何在Asp.Net web api控制器构造函数中注入用户标识?

时间:2018-04-19 23:35:57

标签: c# asp.net asp.net-web-api dependency-injection owin

我有一个装有[Authorize]属性的控制器。我想完成以下操作,以便我不必重复创建存储库obj并在每个方法中传递currentUser:

[Authorize]
public class HomeController : ApiController
{
    Repository repo;     

    public HomeController()
    {
        var userName = User.Identity.IsAuthenticated ? User.Identity.Name : null;

        repo = new Repository(userName);

    }           

}

我知道User.Identity在构造函数或Initialize方法中不可用。 在控制器构造函数中注入经过身份验证的用户的最佳做法是什么。

如果我们使用依赖注入 - 在注册方法中注册 WebApiConfig.cs 中的自定义创建的UserResolverService时 - 此时此时也无法使用User.Identity。

这是web api的一个非常常见的问题,但不知道怎么找不到任何显示正确解决方案的文章。

这是否真的可以实现,如果是的话,你能提供一些示例代码吗?

2 个答案:

答案 0 :(得分:0)

这是我如何解决此问题的方法(不确定这种方法的适用性,但可以工作)。

在您的BaseContoller(所有其他控制器都从其继承的控制器)中创建存储库实例,如下所示:

private Repository _Repository;
private Repository Repository
{
    get 
    {
        _Repository.InjectUsername(User.Identity.Name); // value is already available here
        return _Repository;
    }
    set
    {
        _Repository = new Repository();
    }
}

请注意您的存储库如何使用InjectUsername方法。该方法将简单地将传递的参数分配给某些存储库的属性,如下所示:

public class Repository
{
    private string Username { get; set; }

    public void InjectUsername(string username)
    {
        Username = username;
    }
}

每次您从控制器操作中调用存储库中的某个方法时,都会注入已经存在的usrename,并且不必每次都将用户名传递给存储库中的每个方法来重复代码。

答案 1 :(得分:-1)

您可以注册工厂代理并从HttpContext.Current获取用户身份。

以下是simpleinjector

的示例代码
container.Register<IPrincipal>(() => HttpContext.Current.User);