zoukankan      html  css  js  c++  java
  • Microsoft.AspNet.Identity 的简单使用

    要完成一个简单的注册,登陆,至少需要实现Identity中的3个接口

    IUser  
    IUserStore<TUser> : IDisposable where TUser : IUser
    IUserPasswordStore<TUser> : IUserStore<TUser>, IDisposable where TUser : IUser
    其中IUser是实体,默认需要实现id和name两个属性
    IUserStore是对User的crud,IUserPasswordStore是对密码的操作
    在Identity中,密码不是必须的。
    PS:目前没有深入了解为什么密码不是必须的,但是初步想来是因为要与oauth接口第三方平台提供的登陆,oauth的情况下本地可能是不存储密码的
     
    public class TestUser:IUser
    {
        public TestUser()
        {
            Id = Guid.NewGuid().ToString();
        }
        public string Id { get; set; }
        public string UserName { get; set; }
        public string ElseProperty { get; set; }
        public string Passwd { get; set; }
    }
    简单的实现一个IUser,这里我们还是要保存密码的
    public class TestUesrStore:IUserStore<TestUser>,IUserPasswordStore<TestUser>

    之后实现一个Store,同时实现上面的两个接口,具体的实现下面再详细说明

    在Microsoft.AspNet.Identity.Core.dll中,提供了一个用于操作管理的类

    public class UserManager<TUser> : IDisposable where TUser : IUser
    其构造函数需要一个参数,类型为IUserStore<TUser>
    public UserManager(IUserStore<TUser> store)
     
    在controller中,我们可以实例化这个UserManager
    UserManager = new UserManager<TestUser>(new TestUesrStore());
    UserManager是一个private变量,来保存这个实例
     
    之后我们使用UserManager来完成对应的功能
    以注册为例:
    UserManager本身有CreateAsync方法,而扩展方法有Create。不管是那种,都有2种重载
    public virtual async Task<IdentityResult> CreateAsync(TUser user)
    public virtual async Task<IdentityResult> CreateAsync(TUser user, string password)
    一种是传密码的,一种是不传密码的。不论那种,最终会调用Store(IUserStore)的CreateAsync方法去持久化。区别在于传密码的还要调用IUserPasswordStore中的方法去处理密码相关的东西
    下面是相对完整的代码
    var user = new TestUser { 
        UserName=uname,
        Passwd=passwd,
        ElseProperty=elsepro
    };
                
    var result =await UserManager.CreateAsync(user, passwd);
    
    if (result.Succeeded)
    {
        return RedirectToAction("login");
    }

    登陆时,有2步

    1.判断登陆名密码是不是正确

    2.设置登陆(如cookie等)

    var user = await UserManager.FindAsync(name, passwd);
    判断user是不是null可知用户密码是否正确
     
    如何设置cookie呢,从mvc5的示例中可以找到。与owin相关,这里不做详细说明。
     
     
    面具体说一下IUserStore和IUserPasswordStore的实现
     
    所有的方法,返回都是Task,根据方法名基本可以猜到干什么,大都是读写库操作
    你可以new Task返回,但是注意,在返回之前要调用task的Start方法来让task执行,否则会卡主
     
    另外,还可以使用Task.FromResult来返回,可参考Microsoft.AspNet.Identity.EntityFramework.dll中UserStore的实现方法
     
    public Task SetPasswordHashAsync(TestUser user, string passwordHash)

    需要注意的是这个方法

    这个方法是在注册的时候就会用到的,他的作用是把明文的密码设置成密文的密码,所以你只要设置user的密码属性为passwordHash即可,并不需要在这里进行持久化

    var t= new Task(() =>
    {
        user.Passwd = passwordHash;
    });
    t.Start();
    return t;
    或者
    user.Passwd = passwordHash;
    return Task.FromResult<int>(0);

    以上是一个简单的注册登陆使用Identity的实现

    他和以前自己实现的思路基本是差不多的。

    但是,从Identity的意义来说,对同一个人(IUser),他应该是有多种不同的登陆方式的

    如:直接输入用户密码,使用QQ账号,使用微博账号等。

    所以,我猜测Identity中的IUserLoginStore<TUser>就是干这个用的。

    目前还没有更深入的研究

  • 相关阅读:
    SpringMVC(二)
    SpringMVC(一)
    Mybatis之mapper.xml配置文件中的#{}和${}
    Mybatis(二)
    Mybatis(一)
    Linux部署项目
    BOS物流项目第十三天
    Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans.xsd'
    景点API支持查询携程旅游门票景点详情
    Html引入百度富文本编辑器ueditor及自定义工具栏
  • 原文地址:https://www.cnblogs.com/czcz1024/p/3492527.html
Copyright © 2011-2022 走看看