上接:

最简实例演示asp.net5中用户认证和授权(2)

在实现了角色的各种管理接口后,下一步就是实现对用户的管理,对用户管理的接口相对多一些,必须要实现的有如下三个:

1 public interface IUserRoleStore<TUser> : IUserStore<TUser>, IDisposable where TUser : class
2
3 public interface IUserPasswordStore<TUser> : IUserStore<TUser>, IDisposable where TUser : class
4
5 public interface IQueryableUserStore<TUser> : IUserStore<TUser>, IDisposable where TUser : class

第一个是关于用户和角色关系的接口,定义了和角色相关的几个方法。

第二个是关于密码的,定义了用户密码的读取和设置等方法。

最后一个是关于用户本身的,定义了用户增删改查等方法。

下面是具体的代码:

  1 public class HDUserStore<TUser> :
2 IUserRoleStore<TUser>,
3 IUserPasswordStore<TUser>,
4 IQueryableUserStore<TUser>
5 where TUser : HDUser, new()
6 {
7 /// <summary>
8 /// 存储用户列表
9 /// </summary>
10 private readonly Dictionary<string, TUser> _users = new Dictionary<string, TUser>();
11
12 public IQueryable<TUser> Users
13 {
14 get
15 {
16 if (_users.Count == 0)
17 {
18 //生成用户
19 TUser user = CreateNewUser("1", "daxia", "qingdao");
20 //设置用户角色
21 user.Roles.Add(new HDUserRole() { UserId = "1", RoleId = "power" });
22 _users.Add(user.Id, user);
23
24 user = CreateNewUser("2", "aspnet5", "mvc6");
25 user.Roles.Add(new HDUserRole() { UserId = "2", RoleId = "admin" });
26 _users.Add(user.Id, user);
27 }
28 return _users.Values.AsQueryable();
29 }
30 }
31
32 /// <summary>
33 /// 生成用户
34 /// </summary>
35 /// <param name="id"></param>
36 /// <param name="name"></param>
37 /// <param name="pwd"></param>
38 /// <returns></returns>
39 private TUser CreateNewUser(string id, string name, string pwd)
40 {
41 TUser user = new TUser();
42 user.PassWord = pwd;
43 user.Id = id;
44 user.UserName = name;
45 user.NormalizedUserName = name.ToUpper();
46 PasswordHasher<TUser> hash = new PasswordHasher<TUser>();
47 user.PasswordHash = hash.HashPassword(user, user.PassWord);
48
49 return user;
50 }
51
52 public Task AddToRoleAsync(TUser user, string roleId, CancellationToken cancellationToken)
53 {
54 user.Roles.Add(new HDUserRole { RoleId = roleId, UserId = user.Id });
55 return Task.FromResult(0);
56 }
57
58 public Task<IdentityResult> CreateAsync(TUser user, CancellationToken cancellationToken)
59 {
60 _users[user.Id] = user;
61 return Task.FromResult(IdentityResult.Success);
62 }
63
64 public Task<IdentityResult> DeleteAsync(TUser user, CancellationToken cancellationToken)
65 {
66 if (user == null || !_users.ContainsKey(user.Id))
67 {
68 throw new InvalidOperationException("Unknown user");
69 }
70 _users.Remove(user.Id);
71 return Task.FromResult(IdentityResult.Success);
72 }
73
74 public void Dispose()
75 {
76
77 }
78
79 public Task<TUser> FindByIdAsync(string userId, CancellationToken cancellationToken)
80 {
81 if (_users.ContainsKey(userId))
82 {
83 return Task.FromResult(_users[userId]);
84 }
85 return Task.FromResult<TUser>(null);
86 }
87
88 public Task<TUser> FindByNameAsync(string userName, CancellationToken cancellationToken)
89 {
90 return
91 Task.FromResult(
92 Users.FirstOrDefault(u => u.UserName.ToUpper() == userName.ToUpper()));
93 }
94
95 public Task<string> GetNormalizedUserNameAsync(TUser user, CancellationToken cancellationToken)
96 {
97 return Task.FromResult(user.NormalizedUserName);
98 }
99
100 public Task<string> GetPasswordHashAsync(TUser user, CancellationToken cancellationToken)
101 {
102 return Task.FromResult(user.PasswordHash);
103 }
104
105 public Task<IList<string>> GetRolesAsync(TUser user, CancellationToken cancellationToken)
106 {
107 return Task.FromResult<IList<string>>(user.Roles.Select(ur => ur.RoleId).ToList());
108 }
109
110 public Task<string> GetUserIdAsync(TUser user, CancellationToken cancellationToken)
111 {
112 return Task.FromResult(user.Id);
113 }
114
115 public Task<string> GetUserNameAsync(TUser user, CancellationToken cancellationToken)
116 {
117 return Task.FromResult(user.UserName);
118 }
119
120 public Task<IList<TUser>> GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken)
121 {
122 if (String.IsNullOrEmpty(roleName))
123 {
124 throw new ArgumentNullException(nameof(roleName));
125 }
126
127 return Task.FromResult<IList<TUser>>(Users.Where(u => (u.Roles.Where(x => x.RoleId == roleName).Count() > 0)).Select(x => x).ToList());
128
129 }
130
131 public Task<bool> HasPasswordAsync(TUser user, CancellationToken cancellationToken)
132 {
133 return Task.FromResult(user.PassWord != null);
134 }
135
136 public Task<bool> IsInRoleAsync(TUser user, string roleName, CancellationToken cancellationToken)
137 {
138 return Task.FromResult(user.Roles.Any(ur => ur.RoleId == roleName));
139 }
140
141 public Task RemoveFromRoleAsync(TUser user, string roleName, CancellationToken cancellationToken)
142 {
143 var roleEntity = user.Roles.SingleOrDefault(ur => ur.RoleId == roleName);
144 if (roleEntity != null)
145 {
146 user.Roles.Remove(roleEntity);
147 }
148 return Task.FromResult(0);
149 }
150
151 public Task SetNormalizedUserNameAsync(TUser user, string normalizedName, CancellationToken cancellationToken)
152 {
153 user.NormalizedUserName = normalizedName;
154 return Task.FromResult(0);
155 }
156
157 public Task SetPasswordHashAsync(TUser user, string passwordHash, CancellationToken cancellationToken)
158 {
159 user.PasswordHash = passwordHash;
160 return Task.FromResult(0);
161 }
162
163 public Task SetUserNameAsync(TUser user, string userName, CancellationToken cancellationToken)
164 {
165 user.UserName = userName;
166 return Task.FromResult(0);
167 }
168
169 public Task<IdentityResult> UpdateAsync(TUser user, CancellationToken cancellationToken)
170 {
171 _users[user.Id] = user;
172 return Task.FromResult(IdentityResult.Success);
173 }
174 }

代码本身比较易懂,这一块要注意的是在我们生成用户的同时,把角色也附加到了用户上面,当然,这一块也都可以通过自定义的数据库实现数据存取。

下篇:

最简实例演示asp.net5中用户认证和授权(4)

最简实例演示asp.net5中用户认证和授权(3)的更多相关文章

  1. 最简实例演示asp.net5中用户认证和授权(4)

    上篇: 最简实例演示asp.net5中用户认证和授权(3) 上面我们把自定义认证和授权的相关的最小基础类和要实现的接口都实现了,下面就是如何来进行认证和授权的配置. 首先我们要告诉系统,我们的用户和角 ...

  2. 最简实例演示asp.net5中用户认证和授权(2)

    上接最简实例演示asp.net5中用户认证和授权(1) 基础类建立好后,下一步就要创建对基础类进行操作的类了,也就是实现基础类的增删改查(听起来不太高大上),当然,为了使用asp.net5的认证机制, ...

  3. 最简实例演示asp.net5中用户认证和授权(1)

    asp.net5中,关于用户的认证和授权提供了非常丰富的功能,如果结合ef7的话,可以自动生成相关的数据库表,调用也很方便. 但是,要理解这么一大堆关于认证授权的类,或者想按照自己项目的特定要求对认证 ...

  4. [转]asp.net5中使用NLog进行日志记录

    本文转自:http://www.cnblogs.com/sguozeng/articles/4861303.html asp.net5中使用NLog进行日志记录 asp.net5中提供了性能强大的日志 ...

  5. asp.net5中使用NLog进行日志记录

    asp.net5中提供了性能强大的日志框架,本身也提供了几种日志记录方法,比如记录到控制台或者事件中等,但是,对大部分程序员来说,更喜欢使用类似log4net或者Nlog这种日志记录方式,灵活而强大. ...

  6. 【翻译】asp.net core2.1认证和授权解密

    asp.net core2.1认证和授权解密 本篇文章翻译自:https://digitalmccullough.com/posts/aspnetcore-auth-system-demystifie ...

  7. asp.net core2.1认证和授权解密

    来源:https://www.cnblogs.com/pangjianxin/p/9372562.html asp.net core2.1认证和授权解密 本篇文章翻译自:https://digital ...

  8. springSecurity + jwt + redis 前后端分离用户认证和授权

    记录一下使用springSecurity搭建用户认证和授权的代码... 技术栈使用springSecurity + redis + JWT + mybatisPlus 部分代码来自:https://b ...

  9. ASP.NET5 中静态文件的各种使用方式

    所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况 ...

随机推荐

  1. 为JFileChooser设定扩展名过滤

    --------------------siwuxie095                             工程名:TestFileChooser 包名:com.siwuxie095.fil ...

  2. 由hibernate配置cascade而导致的软件错误,并分析解决此问题的过程

    本文与上一篇文章的软件背景相同,是一个安装部署的工具,这个工具会生成整套系统部署用的xml文件. 这个工具中有一个“克隆”功能,当安装包有新版本后,可以克隆之前的xml版本,并在其基础上做少许修改来适 ...

  3. Java Learning 000 搭建开发环境

    Java Learning 000 搭建开发环境 你需要两个软件: * JDK (Java Develop Kit :Java开发工具包) * eclipse (eclipse 集成开发环境软件) 安 ...

  4. 向PCD文件写入点云数据

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=83 本小节我们学习如何向PCD文件写入点云数据. 代码 章例2文件夹中,打开 ...

  5. p1198&bzoj1012 最大数

    传送门(洛谷) 传送门(bzoj) 题目 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数 ...

  6. hdu1058

    #include<iostream> #include<string> using namespace std; int const N = 4; int map[N] = { ...

  7. C# 绘制图表(柱状图,线性图,饼状图)

    http://blog.csdn.net/gisfarmer/article/details/3736452 Chart饼状图,每根柱子的宽度: int a = Chart1.Series[" ...

  8. Codeforces Round #279 (Div. 2) C. Hacking Cypher (大数取余)

    题目链接 C. Hacking Cyphertime limit per test1 secondmemory limit per test256 megabytesinputstandard inp ...

  9. Sharepoint2013商务智能学习笔记之Excel Service展示Sql Server数据Demo(五)

    第一步,打开Excel新建空白工作簿 第二步,使用Excel连接sql 数据库 第三步,画图 第四步 添加筛选器 最后效果如下: 第五步,将Excel上传到sharepoint任意文档库,并直接点击 ...

  10. Netty 线程模型与Reactor 模式

    前言 Netty 的线程模型是基于NIO的Selector 构建的,使用了异步驱动的Reactor 模式来构建的线程模型,可以很好的支持成百上千的 SocketChannel 连接.由于 READ/W ...