Asp.net mvc 在运行时使用Unity属性注入注入IPrincipal
在ASP.NETMVC2应用程序中使用Unity,我对正确实例化的控制器有各种依赖关系。但是,我希望确保用户当前的IPrincipal将通过注入传递给较低级别的服务、存储库等 因此,在较低级别的服务中,我有如下内容:Asp.net mvc 在运行时使用Unity属性注入注入IPrincipal,asp.net-mvc,dependency-injection,unity-container,Asp.net Mvc,Dependency Injection,Unity Container,在ASP.NETMVC2应用程序中使用Unity,我对正确实例化的控制器有各种依赖关系。但是,我希望确保用户当前的IPrincipal将通过注入传递给较低级别的服务、存储库等 因此,在较低级别的服务中,我有如下内容: [Dependency] IPrincipal CurrentUser {get; set;} 如果我使用属性依赖项注入,我不会得到我想要的,因为控制器是在用户主体可用之前实例化的,并且在任何情况下Unity都不知道如何获得当前用户凭据 所以我想要的是能够将当前用户的IPrinc
[Dependency] IPrincipal CurrentUser {get; set;}
如果我使用属性依赖项注入,我不会得到我想要的,因为控制器是在用户主体可用之前实例化的,并且在任何情况下Unity都不知道如何获得当前用户凭据
所以我想要的是能够将当前用户的IPrincipal(或者可能是RolePrincipal)注入到控制器的一个依赖项中
我怎样才能做到这一点呢?为什么不走直达路线,然后分配它呢 Thread.CurrentPrincipal=用户
依赖注入很好,但不要让它妨碍最好的依赖注入者程序员。为什么要注入它?当前主体已作为
用户
出现。这就是我们所使用的,到目前为止效果很好。用户不应该在单个请求中更改,是吗
protected void Application_AuthenticateRequest()
{
var ticket = GetAuthenticationTicket();
// Perform actual authentication, etc.
MyUser user = BigAuthStuff();
Context.User = user;
Thread.CurrentPrincipal = user;
}
public class MyBaseController : Controller
{
protected MyUser AuthenticatedUser
{
get { return User as MyUser; }
}
}
虽然这条线索很古老,但乔恩·克鲁格似乎有一个直接回答了原始问题的答案:谢谢乔尔特科拉先生和姆涅莫辛先生的回答。我同意关于依赖注入的评论。我现在的想法是让它自动出现在服务和存储库中,这样在开发人员每次更新数据库时控制器类中就不会有额外的代码。由于这与审计相关,我希望确保运行时用户始终可用,并且开发人员不必记住传递它。+1 Thread.CurrentPrincipal已经是处理当前用户的事实标准,很少有理由偏离这种公认的编码习惯用法。应用程序是多层的,极有可能部署到多层中,因此我有一个应用程序CustomPrincipal,可以通过它来避免对具有HttpContext依赖关系的中/后端层的任何污染。假设Web演示文稿(MVC控制器)与中端服务之间存在WCF通信,我是否可以确定Thread.CurrentPrincipal将返回WebForms authenticated IPrincipal?Context.User,如果网站调用技术无关的域模型,则该用户的工作不太好。如果域模型试图访问任何类型的HTTP上下文,那将是一个严重的错误。然而,我认为域模型无论如何都不应该与一些静态外部交互。其思想是将用户放入上下文中,以便控制器可以使用它。最终,应该是控制器调用域模型,对吗?也许您可以更进一步地说:域模型根本不应该有关于用户执行代码的概念。如果域模型与授权有关,那么它只需要包含该功能本身,因此我们必须基于当前用户设置域模型,我们也应该在controller中这样做?!问题是通过wcf在多层部署中一路传递凭据,并在自定义原则中带来一些其他属性(例如角色)。我没有使用wcf,因此我很难对此发表评论。也许你应该在原来的问题中这样说?对于一个“普通”的MVC应用程序,我的方法可以很好地工作,并且在定制的IPrincipal中也有角色等。尽管我必须承认,让用户进入
应用程序\u AuthenticateRequest()
并不是很聪明,因为通常不需要执行身份验证,例如图像。再说一次,使用CDN应该是没有问题的。。。