最简实例演示asp.net5中用户认证和授权(3)
上接:
在实现了角色的各种管理接口后,下一步就是实现对用户的管理,对用户管理的接口相对多一些,必须要实现的有如下三个:
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中用户认证和授权(3)的更多相关文章
- 最简实例演示asp.net5中用户认证和授权(4)
上篇: 最简实例演示asp.net5中用户认证和授权(3) 上面我们把自定义认证和授权的相关的最小基础类和要实现的接口都实现了,下面就是如何来进行认证和授权的配置. 首先我们要告诉系统,我们的用户和角 ...
- 最简实例演示asp.net5中用户认证和授权(2)
上接最简实例演示asp.net5中用户认证和授权(1) 基础类建立好后,下一步就要创建对基础类进行操作的类了,也就是实现基础类的增删改查(听起来不太高大上),当然,为了使用asp.net5的认证机制, ...
- 最简实例演示asp.net5中用户认证和授权(1)
asp.net5中,关于用户的认证和授权提供了非常丰富的功能,如果结合ef7的话,可以自动生成相关的数据库表,调用也很方便. 但是,要理解这么一大堆关于认证授权的类,或者想按照自己项目的特定要求对认证 ...
- [转]asp.net5中使用NLog进行日志记录
本文转自:http://www.cnblogs.com/sguozeng/articles/4861303.html asp.net5中使用NLog进行日志记录 asp.net5中提供了性能强大的日志 ...
- asp.net5中使用NLog进行日志记录
asp.net5中提供了性能强大的日志框架,本身也提供了几种日志记录方法,比如记录到控制台或者事件中等,但是,对大部分程序员来说,更喜欢使用类似log4net或者Nlog这种日志记录方式,灵活而强大. ...
- 【翻译】asp.net core2.1认证和授权解密
asp.net core2.1认证和授权解密 本篇文章翻译自:https://digitalmccullough.com/posts/aspnetcore-auth-system-demystifie ...
- asp.net core2.1认证和授权解密
来源:https://www.cnblogs.com/pangjianxin/p/9372562.html asp.net core2.1认证和授权解密 本篇文章翻译自:https://digital ...
- springSecurity + jwt + redis 前后端分离用户认证和授权
记录一下使用springSecurity搭建用户认证和授权的代码... 技术栈使用springSecurity + redis + JWT + mybatisPlus 部分代码来自:https://b ...
- ASP.NET5 中静态文件的各种使用方式
所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况 ...
随机推荐
- 基于ftp服务实现yum网络共享
安装ftp服务:yum install vsftpd 安装后: CentOS7 启动服务:systemctl start vsftpd 设置开机启动:systemctl enable vsftpd 同 ...
- Skyline实现橡皮筋效果绘制矩形框
这种类似于框选的效果用的比较普遍,一般三维平台和GIS平台都提供了支持接口,可是Skyline就是这么傲娇! 思路是这样的:绘制出的矩形框应该是一直与屏幕边框平行的,也就是矩形框的实际旋转角度是等于摄 ...
- windows修改远程桌面RDP连接数
windows 2003在默认情况下最多只允许两个用户进行远程终端连接,当达到两个远程桌面连接的到时候,再有人尝试连接,就会提示已经达到最大终端数,无法连上了. 一.windows2003终端连接数修 ...
- windows统计端口连接数
netstat -na -p tcp| findstr 80 | find /C "ESTABLISH" netstat -an -p tcp | find "127.0 ...
- OS X 10.9 Mavericks下显示和隐藏文件(区别10.8.*)
我们常常在Windows系统下通过界面设置显示和隐藏文件,在Mac OS X通常采用defaults write命令来解决这个问题. 之前的OS X 10.8.*系统可以使用如下两条命令来开始或者关闭 ...
- 【总结整理】JavaScript的DOM事件学习(慕课网)
事件:在文档或者浏览器窗口中发生的一些,特定的交互瞬间 HTML和JavaScript的交互通过事件 来实现 比如:1.滚动条向下滑动,加载图片 2.图片轮播,鼠标由2-5页调换 本章内容1.理解事件 ...
- HDU 5973 Game of Taking Stones (威佐夫博弈+高精度)
题意:给定两堆石子,每个人可以从任意一堆拿任意个,也可以从两堆中拿相同的数量,问谁赢. 析:直接运用威佐夫博弈,floor(abs(a, b) * (sqrt(5)+1)/2) == min(a, b ...
- SAS笔记(3) LAG和DIFF函数
在实际的应用中,我们会想查看当前观测的上一个观测值,在上一篇博客中我们使用了RETAIN语句来记录上一条观测,其实SAS还提供了一个很好用的函数LAG.当我们使用函数时,一定要明确该函数的返回值是什么 ...
- 使用js页面添加或删除标签
// 添加var container = document.getElementById('divAudio');container.appendChild(audio); // 删除var cont ...
- UPC11073(DP,思维)
#include<bits/stdc++.h>using namespace std;long long dp[507][507];const long long mod = 998244 ...