近些天,看了一些博客园大牛关于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 用户登录和匿名登录,及权限验证相关推荐

  1. WebApi用户登录验证及服务器端用户状态存取

    最近项目需要给手机端提供数据,采用WebApi的方式,之前的权限验证设计不是很好,这次采用的是Basic基础认证. 1.常见的认证方式 我们知道,asp.net的认证机制有很多种.对于WebApi也不 ...

  2. Bootstrap4+MySQL前后端综合实训-Day06-AM【eclipse详细配置Tomcat、开发web项目、servlet、连接MySQL8.0数据库、用户登录界面的编写与验证、分页查询】

    [Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目   录 eclipse重置视图 MySQL数据库--建数据库.建数据库 s ...

  3. Linux学习笔记(四)之用户登录

    1.Linux是一个网络操作系统,作为多用户,多任务的操作系统,其系统资源是所有用户共享的.任何要使用系统资源者必须先在系统内登记,注册,即开设用户账号,该账号又包含用户名,口令,所用的shell,使 ...

  4. 尚硅谷谷粒学院学习笔记9--前台用户登录,注册,整合jwt,微信登录

    用户登录业务 单点登录(Single Sign On),简称SSO. 用户只需要登陆一次就可以访问所有相互信任的应用系统 单点登录三种常见方式 session广播机制实现 使用redis+cookie ...

  5. sqlplus普通用户登录oracle,Oracle学习笔记:sqlplus用户登录

    1 sqlplus 登录 本地登录 (登录数据库服务器) Oracle 登录 sqlplus 账户名/密码 as 角色名 1.1 sys登录 例如: sqlplus sys/or 1 sqlplus ...

  6. jsf的初步使用(包括jsf框架的引入、用户登录、自定义表单验证、valueChangeEvent值变更事件处理做的级联下拉框)

    jsf初步使用 一.新建一个web项目MyJSF 直接把生成index.jsp和web.xml勾选上生成对应的文件. 在web项目跟目录下(一般是web或者是WebRoot,也可以自己指定,本人用的是 ...

  7. WebApi权限验证流程的设计和实现

    前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权 ...

  8. php mysql用户登录_php mysql实现用户登录功能的代码示例

    接着上次的php mysql添加用户的功能代码,今天来学习下php实现用户登录与注销的功能,通过跟踪session会话来保存用户的登陆状态. 1,登录页面 login.php 用户登录_www.# 用 ...

  9. 【软件测试】:“用户登录”功能测试用例设计方法

    谈谈登录测试 可能你会说,"用户登录"这个测试对象也有点太简单了吧,我只要找一个用户,让他在界面上输入用户名和密码,然后点击"确 认"按钮,验证一下是否登录成功 ...

  10. web实验新浪邮箱、下拉小说列表、验证用户登录

    html.css.js 新浪邮箱 下拉小说列表 验证用户登录 新浪邮箱 1.制作以下的新浪 邮箱登录界面: 要求: 1)首先给文本框制作细边框样式,当鼠标放在文本框上时,输入框的边框颜色发生变化,当鼠 ...

最新文章

  1. MyBufferedReader
  2. 如何才能写出一手高质量优美的代码
  3. 全球及中国天然香豆素行业竞争态势与投资份额调研报告2022版
  4. hbase rpc这点事
  5. 步步为营 .NET 设计模式学习笔记 十三、Bridge (桥接模式)
  6. totolinkn200up怎么设置_totolinkN200R无线路由器如何设置啊,求高人指点
  7. linux没有root密码xshell,LINUX终端免密登陆(以Xshell为例)
  8. java 自定义 钩子_Java添加关闭钩子里面的方法
  9. LeetCode-----算法448.找到所有数组中消失的数字
  10. SQL Server 2008存储结构之GAM、SGAM
  11. 如何调节电脑显示屏来保护双眼的小技巧
  12. Cuiwei Li / Detection of ECG characteristic points using wavelet transforms
  13. 中图分类法----T-0
  14. 【ERP】什么是ERP?MRP和ERP的关系是什么?怎么区分ERP对象·企业的生产类型?(3月29日ERP第一章学习笔记)
  15. 科研实习 | 北京大学万小军老师课题组招收NLP方向实习生和访问学生
  16. 比较两种计算机语言的英语论文,英语计算机论文大纲模板样本 英语计算机论文提纲怎样写...
  17. stm32f103电子钟心得体会_STM32中的时钟
  18. 哪款苹果无线充电宝最好?苹果无线充电宝哪个牌子好
  19. 预防XSS,这几招管用!
  20. 利用Python, PyQt5,Selenium,百度图像识别API制作文献阅读辅助工具

热门文章

  1. 如果突然多了一笔财富。。
  2. 如何编写 maptalks plugin
  3. 2.NET Core设定数据库种子
  4. 关于Mysql 查询所有表的实时记录用于对比2个MySQL 库的数据是否异步
  5. 【luogu T34117 打油门】 题解
  6. 二、saltstack基础配置
  7. .AsEnumerable() 和 .ToList() 的区别:
  8. eclipse中jsp页面%@page import=javax.servlet.http.*%报错
  9. Rem实现自适应初体验
  10. OS + RedHat 6.3 x64 / sshd X11 /