如何为ASP.NET 5 MVC 6实现NoSQL身份提供程序
根本没有文档.
我知道我必须实现自己的IUser,我自己的IUserSTore并以某种方式在startup.cs中注册它们.我删除了对EntityFramework的所有引用,因为我想使用NoSQL后端. 只要记录和公开,“惯例”理念就非常好. 任何提示? 解决方法
我刚刚做了Identity 2.0的自定义实现,正如你所说,我没有找到任何有用的文档.但幸运的是,我设法实现了我的目标.
假设您使用的是N层次结构,将您的视图与业务逻辑和业务逻辑从数据访问层隔离开来,我将回答您的问题.并假设还有一个依赖注入容器,如Unity. 我将解释在使用Identity框架和自定义数据访问时必须遵循的步骤: 首先,您必须声明您的域类,实现IUser,如果需要,还可以向其添加自定义属性: //This class is implementing IUser with Guid as type because //I needed to use Guid as default Id. public class CustomUser : IUser<Guid> { public string CustomProperty { get; set; } } 然后,在业务逻辑层中,您应该有一个类来处理与用户授权,登录,密码恢复等相关的所有任务.该类必须从UserManager继承.结果如下: // Business layer class must inherit from UserManager with // CustomUser and Guid as types public AuthorizationManager : UserManager<CustomUser,Guid>,IAuthorizationManager { private readonly ICustomUserMongoRepository repository; private readonly ICustomEmailService emailService; private readonly ICustomTokenProvider tokenProvider; // Parameters being injected by Unity. // container.RegisterType<ICustomUserMongoRepository,CustomUserMongoRepository>(); // .. // .. public AuthorizationManager( ICustomUserMongoRepository repository,ICustomEmailService emailService,ICustomTokenProvider tokenProvider ) // calling base constructor passing // a repository which implements // IUserStore,among others. : base(repository) { this.repository = repository; // this.EmailService is a property of UserManager and // it has to be set to send emails by your class this.EmailService = emailService; // this.UserTokenProvider is a property of UserManager and // it has to be set to generate tokens for user password // recovery and confirmation tokens this.UserTokenProvider = tokenProvider; } } 从UserManager继承时,它将提供Identity使用的一系列方法,它将强制您的类调用基础构造函数来传递存储库,而不是任何存储库,存储库必须实现接口:IUserStore,IPasswordStore,取决于根据您的要求. 这是很酷的事情发生的时候.在您的数据访问层中,您必须将存储库模式的自定义实现连接到NoSQL数据库(假设它是Mongo).因此,您的ICustomUserMongoRepository应如下所示: public interface ICustomUserMongoRepository : IUserPasswordStore<CustomUser,IUserEmailStore<CustomUser,IUserRoleStore<CustomUser,Guid> { } 而你的Mongo存储库应该是这样的 public CustomUserMongoRepository : MongoRepository<CustomUser>,ICustomUserMongoRepository { // Here you must have your custom implementation (using Mongo) of // ICustomUserRepository which is requesting your class to // implement IUserPasswordStore methods as well public Task CreateAsync(CustomUser user) { //Custom Mongo implementation } public Task DeleteAsync(CustomUser user) { //Custom Mongo implementation } public Task GetEmailAsync(CustomUser user) { //Custom Mongo implementation } public Task GetEmailConfirmedAsync(CustomUser user) { //Custom Mongo implementation } // ... } 最后你的控制器看起来像这样: public class AuthController : Controller { private readonly IAuthorizationManager manager; // Manager being injected by Unity. // container.RegisterType<IAuthorizationManager,AuthorizationManager>(); public AuthController(IAuthorizationManager manager) { this.manager = manager; } // Receives a LogInViewModel with all data needed to allow users to log in [HttpPost] public async Task<ActionResult> LogIn(LogInViewModel viewModel) { // FindAsync it's a method inherited from UserManager,that's // using the Mongo repository passed to the base class // in the AuthorizationManager constructor var user = this.manager.FindAsync(viewModel.Email,viewModel.Password); if(user != null){ // Log in user and create user session } else { // Wrong username or password } } } 重要! 接口IAuthorizationManager它用于提供基于SOLID原则的高质量软件.如果你仔细观察并深入思考它,你会注意到这个接口必须拥有所有UserManager的方法,允许AuthController通过UserManager类中的AuthorizationManager调用所有继承的方法. 对不起,很长的帖子.很难用几行来解释整个过程.我希望它有所帮助.如果您有任何疑问或疑问,请回答此问题,我会尽快回复. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – MVC3 TextBoxFor与EditorFor –
- [你必须知道的.NET] 第八回:品味类型---值类型与
- asp.net-mvc – 如何构建一个企业MVC应用程序,业
- asp.net – IIS 6不显示默认文档(default.aspx)
- asp.net – Owin Middleware vs ExceptionHandle
- asp.net-mvc-3 – 在编辑模板中,如何将javascrip
- asp.net-mvc – 基于MVC角色的路由
- 从头编写 asp.net core 2.0 web api 基础框架 (1
- 基于声明的身份 – 在asp.net MVC5 EF6中使用流畅
- asp.net – 使用web.config进行密码保护的文件夹