5. WebApi 服务端代码示例

5.1 控制器基类ApiControllerBase

[csharp] view plaincopy

 
  1. ///
  2. /// Controller的基类,用于实现适合业务场景的基础功能
  3. ///
  4. ///
  5. [BasicAuthentication]
  6. public abstract class ApiControllerBase : ApiController
  7. {
  8. }

5.2
权限属性BaseAuthenticationAttribute

[csharp] view
plain
copy

 
  1. ///
  2. /// 基本验证Attribtue,用以Action的权限处理
  3. ///
  4. public class
    BasicAuthenticationAttribute :
    ActionFilterAttribute
  5. {
  6. ///
  7. /// 检查用户是否有该Action执行的操作权限
  8. ///
  9. ///
  10. public override void
    OnActionExecuting(HttpActionContext
    actionContext)
  11. {
  12. //检验用户ticket信息,用户ticket信息来自调用发起方
  13. if
    (actionContext.Request.Headers.Authorization != null)
  14. {
  15. //解密用户ticket,并校验用户名密码是否匹配
  16. var encryptTicket =
    actionContext.Request.Headers.Authorization.Parameter;
  17. if
    (ValidateUserTicket(encryptTicket))
  18. base.OnActionExecuting(actionContext);
  19. else
  20. actionContext.Response = new
    HttpResponseMessage(HttpStatusCode.Unauthorized);
  21. }
  22. else
  23. {
  24. //检查web.config配置是否要求权限校验
  25. bool
    isRquired =
    (WebConfigurationManager.AppSettings["WebApiAuthenticatedFlag"].ToString()
    == "true");
  26. if
    (isRquired)
  27. {
  28. //如果请求Header不包含ticket,则判断是否是匿名调用
  29. var attr =
    actionContext.ActionDescriptor.GetCustomAttributes().OfType();
  30. bool
    isAnonymous = attr.Any(a => a is
    AllowAnonymousAttribute);
  31. //是匿名用户,则继续执行;非匿名用户,抛出“未授权访问”信息
  32. if
    (isAnonymous)
  33. base.OnActionExecuting(actionContext);
  34. else
  35. actionContext.Response = new
    HttpResponseMessage(HttpStatusCode.Unauthorized);
  36. }
  37. else
  38. {
  39. base.OnActionExecuting(actionContext);
  40. }
  41. }
  42. }
  43. ///
  44. /// 校验用户ticket信息
  45. ///
  46. ///
  47. ///
  48. private bool
    ValidateUserTicket(string
    encryptTicket)
  49. {
  50. var userTicket =
    FormsAuthentication.Decrypt(encryptTicket);
  51. var userTicketData =
    userTicket.UserData;
  52. string
    userName = userTicketData.Substring(0,
    userTicketData.IndexOf(":"));
  53. string
    password =
    userTicketData.Substring(userTicketData.IndexOf(":")
    + 1);
  54. //检查用户名、密码是否正确,验证是合法用户
  55. //var isQuilified = CheckUser(userName,
    password);
  56. return true;
  57. }
  58. }

5.3
api服务Controller实例

[csharp] view
plain
copy

 
  1. public class
    ProductController : ApiControllerBase
  2. {
  3. [HttpGet]
  4. public object
    Find(string
    id)
  5. {
  6. return
    ProductServiceInstance.Find(2);
  7. }
  8. // GET api/product/5
  9. [HttpGet]
  10. [AllowAnonymous]
  11. public
    Product Get(string
    id)
  12. {
  13. var headers =
    Request.Headers;
  14. var p =
    ProductServiceInstance.GetById(long.Parse(id));
  15. if
    (p == null)
  16. {
  17. throw new
    HttpResponseException(new
    HttpResponseMessage(HttpStatusCode.BadRequest)
  18. Content = new
    StringContent("id3 not found"),
    ReasonPhrase = "product id not exist."
    });
  19. }
  20. return
    p;
  21. }
  22. }

6.
其它配置说明

6.1
Mvc前端Web.Config 配置

[html] view
plain
copy

 
  1. <</SPAN>system.web>
  2. <</SPAN>compilation debug="true" targetFramework="4.5">
  3. <</SPAN>assemblies>
  4. <</SPAN>add assembly="System.Web.Http.Data.Helpers,
    Version=4.0.0.0, Culture=neutral,
    PublicKeyToken=31bf3856ad364e35" />
  5. </</SPAN>assemblies>
  6. </</SPAN>compilation>
  7. <</SPAN>httpRuntime targetFramework="4.5" />
  8. <</SPAN>authentication mode="Forms">
  9. <</SPAN>forms loginUrl="~/Account/Login" defaultUrl="~/Home/Index" protection="All" timeout="90" name=".AuthCookie"></</SPAN>forms>
  10. </</SPAN>authentication>
  11. <</SPAN>machineKey validationKey="3FFA12388DDF585BA5D35E7BC87E3F0AB47FBBEBD12240DD3BEA2BEAEC4ABA213F22AD27E8FAD77DCFEE306219691434908D193A17C1FC8DCE51B71A4AE54920"
    decryptionKey="ECB6A3AF9ABBF3F16E80685ED68DC74B0B13CCEE538EBBA97D0B893139683B3B"
    validation="SHA1" decryption="AES" />
  12. </</SPAN>system.web>

machineKey节点配置,是应用于对用户ticket数据加密和解密。

6.2
WebApi服务端Web.Config配置

[html] view
plain
copy

 
  1. <</SPAN>system.web>
  2. <</SPAN>machineKey validationKey="3FF112388DDF585BA5D35E7BC87E3F0AB47FBBEBD12240DD3BEA2BEAEC4ABA213F22AD27E8FAD77DCFEE306219691434908D193A17C1FC8DCE51B71A4AE54920"
    decryptionKey="ECB6A3AF9ABBF3F16E80685ED68DC74B0B13CCEE538EBBA97D0B893139683B3B"
    validation="SHA1" decryption="AES" />
  3. </</SPAN>system.web>

machineKey节点配置,是应用于对用户ticket数据加密和解密。

7.
总结

Web系统的用户登录及页面操作权限验证在处理逻辑上比较复杂,需要考虑到Form认证、匿名访问,Session和Cookie存储,以及Session和Cookie的过期处理,本文实现了整个权限验证框架的基本功能,供系统架构设计人员以及Web开发人员参考。

Demo项目代码地址:
https://github.com/lgsky/DemoUserAuthorization/

Web用户的身份验证及WebApi权限验证流程的设计和实现的更多相关文章

  1. [置顶] Web用户的身份验证及WebApi权限验证流程的设计和实现 (不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!!)

     转发 http://blog.csdn.net/besley/article/details/8516894 不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!! [ ...

  2. 转 Web用户的身份验证及WebApi权限验证流程的设计和实现

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

  3. Web用户的身份验证及WebApi权限验证流程的设计和实现 asp.net mvc AllowAnonymous 不起作用, asp.net mvc 匿名访问

    原文地址: https://blog.csdn.net/zjlovety/article/details/17095627 前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个 ...

  4. Web用户的身份验证及WebApi权限验证流程的设计和实现(尾)

    5. WebApi 服务端代码示例 5.1 控制器基类ApiControllerBase [csharp] view plaincopy   /// /// Controller的基类,用于实现适合业 ...

  5. Web用户的身份验证及WebApi权限验证流程的设计和实现(续)

    4.4 权限属性RequireAuthorizationAttribute [csharp] view plaincopy   "font-size:14px;">/// / ...

  6. SpringAOP01 利用AOP实现权限验证、利用权限验证服务实现权限验证

    1 编程范式 1.1 面向过程 1.2 面向对象 1.3 面向切面编程 1.4 函数式编程 1.5 事件驱动编程 2 什么是面向切面编程 2.1 是一种编程范式,而不是一种编程语言 2.2 解决一些特 ...

  7. 学习总结之 WebApi 用户登录和匿名登录,及权限验证

    近些天,看了一些博客园大牛关于webApi项目的的文章,也有请教师兄一些问题,自己做了个Demo试了试,收获甚多.感谢感谢,下面是我一些学习的总结,如若有错的地方请多多指教!! WebApi登陆与身份 ...

  8. 简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)

    前言: shiro因为其简单.可靠.实现方便而成为现在最常用的安全框架,那么这篇文章除了会用简洁明了的方式讲一下基于spring的shiro详细配置和登录注销功能使用之外,也会根据惯例在文章最后总结一 ...

  9. [Abp 源码分析]十二、多租户体系与权限验证

    0.简介 承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限校验的. 1.多租户的 ...

随机推荐

  1. 你想的到想不到的 javascript 应用小技巧方法

    javascript 在前端应用体验小技巧继续积累. 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElemen ...

  2. Android 实现分页(使用TabWidget/TabHost)

    注:本文为转载,但该内容本人已亲身尝试,确认该方法可行,代码有点小的改动,转载用作保存与分享. 原作者地址:http://gundumw100.iteye.com/blog/853967 个人吐嘈:据 ...

  3. ASP.NET 系统对象 Request(一)

    Request对象 用来获取客户端在请求一个页面或传送一个Form是提供的所有信息.它包括用户的HTTP变量.能够识别的浏览器.存储客户端的Cookie信息和请求地址等. Request对象是Syst ...

  4. UIScrollView无法滚动的解决办法

    如果UIScrollView无法滚动,可能是以下原因: 没有设置contentSize scrollEnabled = NO 没有接收到触摸事件:userInteractionEnabled = NO ...

  5. MySQL Cluster 7.3.5 集群配置参数优化(优化篇)

    按照前面的教程:MySQL Cluster 7.3.5 集群配置实例(入门篇),可快速搭建起基础版的MySQL Cluster集群,但是在生成环境中,还是有很多问题的,即配置参数需要优化下, 当前生产 ...

  6. 第三次个人作业—“K米”评测

    第一部分 调研,评测 评测 1.上手体验: 软件欢迎界面,色彩对比鲜明,前三图深色调,最后一条则充满了艳丽的色彩,让人对这个产品突然充满了期待. 软件界面加载速度慢,很多地方点击进去要等好久才能出现界 ...

  7. ICP 算法

    ICP 算法是一种点云到点云的配准方法. 在SLAM中通过空间点云的配准(可以通过相机或者3D激光雷达获取点云数据),可以估计相机运动(机器人运动,旋转矩阵R与平移向量t),累积配准,并不断回环检测, ...

  8. 使用php+swoole对client数据实时更新(上)

    如果想对一个列表做实时的更新,传统的做法是采用轮询的方式.以web为例,通过Ajax定时请求服务端然后获取数据显示在页面.这种方式实现简单,缺点就是浪费资源. HTTP1.1新增加了对websocke ...

  9. 使用iText对pdf做权限的操作(不允许修改,不允许复制,不允许另存为),并且加水印等

    添加水印,并且增加权限 @Test public void addWaterMark() throws Exception{ String srcFile="D:\\work\\pdf\\w ...

  10. jquery 用attr修改src 淡入淡出

    $("#wanwan").animate({ opacity: 'toggle' }, "slow", null, function () { $(" ...