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

问题描述 投票:0回答:2

我有一个装饰有[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方法中不可用。在控制器构造函数中注入经过身份验证的用户的最佳做法是什么。

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

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

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

c# asp.net asp.net-web-api dependency-injection owin
2个回答
0
投票

以下是我如何解决这个问题(不确定这种方法是否合适,但它有效)。

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

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

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

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

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

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


-1
投票

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

这是simpleinjector的示例代码

container.Register<IPrincipal>(() => HttpContext.Current.User);
© www.soinside.com 2019 - 2024. All rights reserved.