我有一个装有[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的一个非常常见的问题,但不知道怎么找不到任何显示正确解决方案的文章。
这是否真的可以实现,如果是的话,你能提供一些示例代码吗?
答案 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);