学习总结之 WebApi 用户登录和匿名登录,及权限验证
近些天,看了一些博客园大牛关于webApi项目的的文章,也有请教师兄一些问题,自己做了个Demo试了试,收获甚多。感谢感谢,下面是我一些学习的总结,如若有错的地方请多多指教!!
WebApi登陆与身份验证
因为在调用接口的时候都必须传sessionKey参数过去,所以必须先登录验证身份。
如果是已注册用户则账号登陆,获得其身份标识的 sessionkey,如果是非账户用户则可以匿名登陆,要输入用户IP地址或者和客户端设备号等以获得sessionkey,然后可以去注册。
#region 登录API/// <summary>/// 登录API (账号登陆)/// </summary>/// <param name="phone">登录帐号手机号</param>/// <param name="hashedPassword">加密后的密码,这里避免明文,客户端加密后传到API端</param>/// <param name="deviceType">客户端的设备类型</param>/// <param name="clientId">客户端识别号, 一般在APP上会有一个客户端识别号</param>/// <returns></returns>[Route("account/login")]public SessionObject Login(string phone, string hashedPassword, int deviceType = 0, string clientId = "") {if (string.IsNullOrEmpty(phone))throw new ApiException("用户名不能为空。", "RequireParameter_userphone");if (string.IsNullOrEmpty(hashedPassword))throw new ApiException("hashedPassword 不能为空.", "RequireParameter_hashedPassword");int timeout = 60;var nowUser = _authenticationService.GetUserByPhone(phone);if (nowUser == null)throw new ApiException("帐户不存在", "Account_NotExits");#region 验证密码if (!string.Equals(nowUser.Password, hashedPassword)) {throw new ApiException("错误的密码", "Account_WrongPassword");}#endregionif (!nowUser.IsActive)throw new ApiException("用户处于非活动状态.", "InactiveUser");UserDevice existsDevice = _authenticationService.GetUserDevice(nowUser.UserId, deviceType);if (existsDevice == null) {string passkey = MD5CryptoProvider.GetMD5Hash(nowUser.UserId + nowUser.Phone + DateTime.UtcNow+ Guid.NewGuid());existsDevice = new UserDevice() {UserId = nowUser.UserId,CreateTime = DateTime.UtcNow,ActiveTime = DateTime.UtcNow,ExpiredTime = DateTime.UtcNow.AddMinutes(timeout),DeviceType = deviceType,SessionKey = passkey};_authenticationService.AddUserDevice(existsDevice);}else {existsDevice.ActiveTime = DateTime.UtcNow;existsDevice.ExpiredTime = DateTime.UtcNow.AddMinutes(timeout);_authenticationService.UpdateUserDevice(existsDevice);}nowUser.Password = "";return new SessionObject() { SessionKey = existsDevice.SessionKey, LogonUser = nowUser };}#endregion
登录API
#region 匿名登陆/// <summary>/// 匿名登陆/// </summary>/// <param name="ip">用户ip地址</param>/// <param name="deviceType">设备类型</param>/// <param name="clientId">客户端识别号</param>/// <returns></returns>[Route("account/AnonymousLogin")]public SessionObject1 AnonymousLogin(string ip, int deviceType = 0, string clientId = ""){if (string.IsNullOrEmpty(ip))throw new ApiException("ip地址不能为空。", "RequireParameter_ip");int timeout = 60;UserDevice existsDevice = _authenticationService.GetUserDevice(ip, deviceType);// Session.QueryOver<UserDevice>().Where(x => x.AccountId == nowAccount.Id && x.DeviceType == deviceType).SingleOrDefault();if (existsDevice == null) {string passkey = MD5CryptoProvider.GetMD5Hash(ip+DateTime.UtcNow + Guid.NewGuid());existsDevice = new UserDevice() {IP = ip,CreateTime = DateTime.UtcNow,ActiveTime = DateTime.UtcNow,ExpiredTime = DateTime.UtcNow.AddMinutes(timeout),DeviceType = deviceType,SessionKey = passkey};_authenticationService.AddUserDevice(existsDevice);}else {existsDevice.ActiveTime = DateTime.UtcNow;existsDevice.ExpiredTime = DateTime.UtcNow.AddMinutes(timeout);_authenticationService.UpdateUserDevice(existsDevice);}return new SessionObject1() { SessionKey = existsDevice.SessionKey, Ip=ip };}#endregion
匿名登陆
身份信息的认证是通过Web API 的 ActionFilter来实现的,所有需要身份验证的API请求都会要求客户端传一个SessionKey。
在这里我们通过一个自定义的SessionValidateAttribute来做客户端的身份验证, 其继承自 System.Web.Http.Filters.ActionFilterAttribute。
public class SessionValidateAttribute : System.Web.Http.Filters.ActionFilterAttribute{public const string SessionKeyName = "SessionKey";public const string LogonUserName = "LogonUser";public override void OnActionExecuting(HttpActionContext filterContext){var qs = HttpUtility.ParseQueryString(filterContext.Request.RequestUri.Query);string sessionKey = qs[SessionKeyName];if (string.IsNullOrEmpty(sessionKey)){throw new ApiException("无效 Session.", "InvalidSession");}IAuthenticationService authenticationService = new AuthenticationService();//IocManager.Intance.Reslove<IAuthenticationService>();//验证用户sessionvar userSession = authenticationService.GetUserDevice(sessionKey);if (userSession == null){throw new ApiException("无此 sessionKey", "RequireParameter_sessionKey");}else{//todo: 加Session是否过期的判断if (userSession.ExpiredTime < DateTime.UtcNow)throw new ApiException("session已过期", "SessionTimeOut");var logonUser = authenticationService.GetUser(userSession.UserId);if (logonUser != null){filterContext.ControllerContext.RouteData.Values[LogonUserName] = logonUser;SetPrincipal(new UserPrincipal<int>(logonUser));}userSession.ActiveTime = DateTime.UtcNow;userSession.ExpiredTime = DateTime.UtcNow.AddMinutes(60);authenticationService.UpdateUserDevice(userSession);}}public static void SetPrincipal(IPrincipal principal){Thread.CurrentPrincipal = principal;if (HttpContext.Current != null){HttpContext.Current.User = principal;}}}
API身份验证
需要身份验证的apiControler 上加上[sessionValidate],则这个Controller下面所有Action都将拥有身份验证功能
如果是需要管理员权限才能请求的数据的话,那么我们再定义一个 SessionValidateAdminAttribute 来做管理员的身份验证,在需要管理员权限才能请求的控制器上加上[SessionValidateAdminAttribute ],则这个控制器下面所有Action都只有通过身份验证的管理员才有权限请求。
public class SessionValidateAdminAttribute : System.Web.Http.Filters.ActionFilterAttribute {public const string SessionKeyName = "SessionKey";public const string LogonUserName = "LogonUser";public override void OnActionExecuting(HttpActionContext filterContext) {var qs = HttpUtility.ParseQueryString(filterContext.Request.RequestUri.Query);string sessionKey = qs[SessionKeyName];if (string.IsNullOrEmpty(sessionKey)) {throw new ApiException("无效 Session.", "InvalidSession");}IAuthenticationService authenticationService = new AuthenticationService();//IocManager.Intance.Reslove<IAuthenticationService>();//验证用户sessionvar userSession = authenticationService.GetUserDevice(sessionKey);if (userSession == null) {throw new ApiException("无此 sessionKey", "RequireParameter_sessionKey");}else {//todo: 加Session是否过期的判断if (userSession.ExpiredTime < DateTime.UtcNow)throw new ApiException("session已过期", "SessionTimeOut");var logonUser = authenticationService.GetUser(userSession.UserId);if (logonUser == null) {throw new ApiException("无此用户", "Invalid_User");}else{if (logonUser.Permissions == 1){filterContext.ControllerContext.RouteData.Values[LogonUserName] = logonUser;SessionValidateAttribute.SetPrincipal(new UserPrincipal<int>(logonUser));}else{throw new ApiException("用户无权限", "No permissions");}}userSession.ActiveTime = DateTime.UtcNow;userSession.ExpiredTime = DateTime.UtcNow.AddMinutes(60);authenticationService.UpdateUserDevice(userSession);}}}
SessionValidateAdminAttribute
关于:[EnableCors(origins: "*", headers: "*", methods: "*")] 的说明,
详情查看:http://www.cnblogs.com/artech/p/cors-4-asp-net-web-api-05.html
关于用户过期时间:每次调用接口的时候 会自动更新sessionKey的过期时间,如果长时间未更新,则下次访问时会过期,则需要重新登陆。
加入身份验证后的 UserControler
[EnableCors(origins: "*", headers: "*", methods: "*")][RoutePrefix("api/Users"), SessionValidate, WebApiTracker] public class UsersController : ApiController{private readonly IUsers _users=new UsersImpl();#region 根据用户ID获得用户信息/// <summary>/// 根据用户ID获得用户信息(获得数据)/// </summary>/// <param name="sessionKey">sessionKey</param>/// <param name="id">用户id</param>/// <returns>result</returns>public ApiResult<Users> GetUserById( string sessionKey,int id){Users modelUsers = _users.GetUserByUsersId(id);if (modelUsers != null){return new ApiResult<Users>("1","获取用户信息成功",modelUsers);}else return new ApiResult<Users>("0","无此用户信息",null);}#endregion/// <summary>/// 新用户注册(增加数据)/// </summary>/// <param name="modelUsers"></param>/// <returns>result</returns>[HttpPost, Route("api/UserRegistration")]public ApiResult<bool> UserRegistration(string sessionKey, AddUserRq modelUsers){Users usersModel=new Users();usersModel.IsActive = true;usersModel.Password = modelUsers.Password;usersModel.Permissions = 2;usersModel.Phone = modelUsers.Phone;usersModel.Sex = modelUsers.Sex;usersModel.TrueName = modelUsers.TrueName;usersModel.UserName = modelUsers.UserName;return _users.RegistrationNewUsers(usersModel);}}
UsersControllers
此随笔乃本人学习工作记录,如有疑问欢迎在下面评论,转载请标明出处。
如果对您有帮助请动动鼠标右下方给我来个赞,您的支持是我最大的动力。
2017-11 代码及数据库文件已经上传至 https://github.com/huangenai/WebAPI
转载于:https://www.cnblogs.com/huangenai/p/5253709.html
学习总结之 WebApi 用户登录和匿名登录,及权限验证相关推荐
- WebApi用户登录验证及服务器端用户状态存取
最近项目需要给手机端提供数据,采用WebApi的方式,之前的权限验证设计不是很好,这次采用的是Basic基础认证. 1.常见的认证方式 我们知道,asp.net的认证机制有很多种.对于WebApi也不 ...
- Bootstrap4+MySQL前后端综合实训-Day06-AM【eclipse详细配置Tomcat、开发web项目、servlet、连接MySQL8.0数据库、用户登录界面的编写与验证、分页查询】
[Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目 录 eclipse重置视图 MySQL数据库--建数据库.建数据库 s ...
- Linux学习笔记(四)之用户登录
1.Linux是一个网络操作系统,作为多用户,多任务的操作系统,其系统资源是所有用户共享的.任何要使用系统资源者必须先在系统内登记,注册,即开设用户账号,该账号又包含用户名,口令,所用的shell,使 ...
- 尚硅谷谷粒学院学习笔记9--前台用户登录,注册,整合jwt,微信登录
用户登录业务 单点登录(Single Sign On),简称SSO. 用户只需要登陆一次就可以访问所有相互信任的应用系统 单点登录三种常见方式 session广播机制实现 使用redis+cookie ...
- sqlplus普通用户登录oracle,Oracle学习笔记:sqlplus用户登录
1 sqlplus 登录 本地登录 (登录数据库服务器) Oracle 登录 sqlplus 账户名/密码 as 角色名 1.1 sys登录 例如: sqlplus sys/or 1 sqlplus ...
- jsf的初步使用(包括jsf框架的引入、用户登录、自定义表单验证、valueChangeEvent值变更事件处理做的级联下拉框)
jsf初步使用 一.新建一个web项目MyJSF 直接把生成index.jsp和web.xml勾选上生成对应的文件. 在web项目跟目录下(一般是web或者是WebRoot,也可以自己指定,本人用的是 ...
- WebApi权限验证流程的设计和实现
前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权 ...
- php mysql用户登录_php mysql实现用户登录功能的代码示例
接着上次的php mysql添加用户的功能代码,今天来学习下php实现用户登录与注销的功能,通过跟踪session会话来保存用户的登陆状态. 1,登录页面 login.php 用户登录_www.# 用 ...
- 【软件测试】:“用户登录”功能测试用例设计方法
谈谈登录测试 可能你会说,"用户登录"这个测试对象也有点太简单了吧,我只要找一个用户,让他在界面上输入用户名和密码,然后点击"确 认"按钮,验证一下是否登录成功 ...
- web实验新浪邮箱、下拉小说列表、验证用户登录
html.css.js 新浪邮箱 下拉小说列表 验证用户登录 新浪邮箱 1.制作以下的新浪 邮箱登录界面: 要求: 1)首先给文本框制作细边框样式,当鼠标放在文本框上时,输入框的边框颜色发生变化,当鼠 ...
最新文章
- MyBufferedReader
- 如何才能写出一手高质量优美的代码
- 全球及中国天然香豆素行业竞争态势与投资份额调研报告2022版
- hbase rpc这点事
- 步步为营 .NET 设计模式学习笔记 十三、Bridge (桥接模式)
- totolinkn200up怎么设置_totolinkN200R无线路由器如何设置啊,求高人指点
- linux没有root密码xshell,LINUX终端免密登陆(以Xshell为例)
- java 自定义 钩子_Java添加关闭钩子里面的方法
- LeetCode-----算法448.找到所有数组中消失的数字
- SQL Server 2008存储结构之GAM、SGAM
- 如何调节电脑显示屏来保护双眼的小技巧
- Cuiwei Li / Detection of ECG characteristic points using wavelet transforms
- 中图分类法----T-0
- 【ERP】什么是ERP?MRP和ERP的关系是什么?怎么区分ERP对象·企业的生产类型?(3月29日ERP第一章学习笔记)
- 科研实习 | 北京大学万小军老师课题组招收NLP方向实习生和访问学生
- 比较两种计算机语言的英语论文,英语计算机论文大纲模板样本 英语计算机论文提纲怎样写...
- stm32f103电子钟心得体会_STM32中的时钟
- 哪款苹果无线充电宝最好?苹果无线充电宝哪个牌子好
- 预防XSS,这几招管用!
- 利用Python, PyQt5,Selenium,百度图像识别API制作文献阅读辅助工具
热门文章
- 如果突然多了一笔财富。。
- 如何编写 maptalks plugin
- 2.NET Core设定数据库种子
- 关于Mysql 查询所有表的实时记录用于对比2个MySQL 库的数据是否异步
- 【luogu T34117 打油门】 题解
- 二、saltstack基础配置
- .AsEnumerable() 和 .ToList() 的区别:
- eclipse中jsp页面%@page import=javax.servlet.http.*%报错
- Rem实现自适应初体验
- OS + RedHat 6.3 x64 / sshd X11 /