我即将开始一个项目,我将使用MVC5.但是,由于我想使用IoC并稍后重用我的用户表,并向其添加自定义内容,我发现很难看到我如何使用MVC5附带的新Identity框架.
我越来越关注基本形式的认证.你有什么解决方案?
我的需求:
必须注入用户存储库/服务
用户存储库必须驻留在DAL中
用户存储库必须能够支持除EF之外的其他技术
使用OpenID和OAuth进行身份验证必须要轻松实现
必须安全
应该可以在其他项目中重复使用,例如.WPF
我一直在寻找答案,但我看到的一切都是在控制器中硬编码的.
你是怎么解决的?您是从头开始编写的,还是可以绑定到可以扩展到其他.NET平台的东西,如WCF和WPF?
以下代码直接来自默认ASP.NET MVC 5模板中的AccountController.它做的第一件事是Bastard Injection
.
[Authorize] public class AccountController : Controller { public AccountController() : this( new UserManager( new UserStore ( new ApplicationDbContext()))) { } public AccountController(UserManager userManager) { UserManager = userManager; } }
接受的答案将交给那个人,它向我展示了他们所做的事情,其中包含了上述要求
由于这是.NET,因此标准的安全方法是在应用程序边界进行身份验证,并将身份验证信息转换为IPrincipal.MVC支持开箱即用.
如果您需要在身份验证期间获得的其他信息,您可以在组合根中收集它并使用它来组合您的服务.
例如,假设您需要在较低层中经过身份验证的用户的电子邮件地址.任何需要用户电子邮件地址的类都可以简单地将其作为具体依赖项请求:
public class EmailThingy { private readonly string userEmail; public EmailThingy(string userEmail) { if (userEmail == null) throw new ArgumentNullException("userEmail"); this.userEmail = userEmail; } // other members go here... }
在ASP.NET MVC中,Composition Root是IControllerFactory.IIRC,您可以从CreateController方法中提取身份验证数据,并使用它来组合您的对象图.
这些天,我以相同的方式使用IPrincipal:我将它作为依赖项注入,而不是依赖于Thread.CurrentPrincipal Ambient Context,因为当通过Constructor Injection一致地注入所有内容时,它更容易进行单元测试.