如何为ASP.NET 5 MVC 6实现NoSQL身份提供程序

前端之家收集整理的这篇文章主要介绍了如何为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相关文章