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. postgresql:pgadmin函数调试工具安装过程

    通过安装第三方插件pldebugger,可实现在pgadmin客户端对函数设置断点.调试,具体过程如下: 1.下载pldebugger安装包:http://git.postgresql.org/git ...

  2. PHP格式化显示文件大小函数

    用filesize() 函数可以返回文件的大小,可是返回值是以字节(B)为单位的,看起来不方便.怎么让它根据文件的大小自动以KB.MB.GB为单位显示呢,用下面这个函数就可以实现了. <?php ...

  3. 第2月第6天 iOS 运行时添加属性和方法

    http://blog.csdn.net/meegomeego/article/details/18356169 第一种:runtime.h里的方法 BOOL class_addProperty(Cl ...

  4. Nginx反向代理+keepalived

    环境两台LB(nginx).两台web(nginx/apache都行) 安装httpd web01 [root@web01 /]# /etc/init.d/iptables stop iptables ...

  5. 编译Android源码

    编译版本要求 基本安装环境 ubuntu 14.04 64 sudo apt-get install git-core gnupg flex bison gperf build-essential \ ...

  6. [转]MyEclipse 里查看jar文件源码

    在开发过程中,有时候需要查看jar文件的源码,这里讲解如何设置.  选中某一个jar文件,如我这里选中的是struts2-core-2.1.6.jar,然后右键-->Properties--&g ...

  7. nginx配置文件或目录404和403

    对于Nginx web目录下的文件,如果不想用户访问那么可以配置返回404或者403状态,默认情况下对于目录来说,如果目录下没有默认文档,那么默认返回是403,也就是不允许查看目录列表,但是如果知道静 ...

  8. October 18th, Week 43rd Tuesday, 2016

    Live as if you were to die tomorrow. 将每一天都当作人生的最后一天来活. If I were to die tomorrow, I may choose to en ...

  9. Swift - UIColor16进制编码与RGB格式互相转换

    Swift UIColor 16进制编码转换RGB : 由于UI出图的时候,通常给的是16进制的编码颜色,我们在开发的时候需要将它转换为RGB格式,现在给出两种代码片段. 一.对UIColor进行扩展 ...

  10. Android平台下OpenCV移植与使用---基于C/C++

    在<Android Studio增加NDK代码编译支持--Mac环境>和<Mac平台下Opencv开发环境搭建>两篇文章中,介绍了如何使用NDK环境和Opencv环境搭建与测试 ...