Web用户的身份验证及WebApi权限验证流程的设计和实现
5. WebApi 服务端代码示例
5.1 控制器基类ApiControllerBase
- ///
- /// Controller的基类,用于实现适合业务场景的基础功能
- ///
- ///
- [BasicAuthentication]
- public abstract class ApiControllerBase : ApiController
- {
- }
5.2
权限属性BaseAuthenticationAttribute
- ///
- /// 基本验证Attribtue,用以Action的权限处理
- ///
- public class
BasicAuthenticationAttribute :
ActionFilterAttribute - {
- ///
- /// 检查用户是否有该Action执行的操作权限
- ///
- ///
- public override void
OnActionExecuting(HttpActionContext
actionContext) - {
- //检验用户ticket信息,用户ticket信息来自调用发起方
- if
(actionContext.Request.Headers.Authorization != null) - {
- //解密用户ticket,并校验用户名密码是否匹配
- var encryptTicket =
actionContext.Request.Headers.Authorization.Parameter; - if
(ValidateUserTicket(encryptTicket)) - base.OnActionExecuting(actionContext);
- else
- actionContext.Response = new
HttpResponseMessage(HttpStatusCode.Unauthorized); - }
- else
- {
- //检查web.config配置是否要求权限校验
- bool
isRquired =
(WebConfigurationManager.AppSettings["WebApiAuthenticatedFlag"].ToString()
== "true"); - if
(isRquired) - {
- //如果请求Header不包含ticket,则判断是否是匿名调用
- var attr =
actionContext.ActionDescriptor.GetCustomAttributes().OfType(); - bool
isAnonymous = attr.Any(a => a is
AllowAnonymousAttribute); - //是匿名用户,则继续执行;非匿名用户,抛出“未授权访问”信息
- if
(isAnonymous) - base.OnActionExecuting(actionContext);
- else
- actionContext.Response = new
HttpResponseMessage(HttpStatusCode.Unauthorized); - }
- else
- {
- base.OnActionExecuting(actionContext);
- }
- }
- }
- ///
- /// 校验用户ticket信息
- ///
- ///
- ///
- private bool
ValidateUserTicket(string
encryptTicket) - {
- var userTicket =
FormsAuthentication.Decrypt(encryptTicket); - var userTicketData =
userTicket.UserData; - string
userName = userTicketData.Substring(0,
userTicketData.IndexOf(":")); - string
password =
userTicketData.Substring(userTicketData.IndexOf(":")
+ 1); - //检查用户名、密码是否正确,验证是合法用户
- //var isQuilified = CheckUser(userName,
password); - return true;
- }
- }
5.3
api服务Controller实例
- public class
ProductController : ApiControllerBase - {
- [HttpGet]
- public object
Find(string
id) - {
- return
ProductServiceInstance.Find(2); - }
- // GET api/product/5
- [HttpGet]
- [AllowAnonymous]
- public
Product Get(string
id) - {
- var headers =
Request.Headers; - var p =
ProductServiceInstance.GetById(long.Parse(id)); - if
(p == null) - {
- throw new
HttpResponseException(new
HttpResponseMessage(HttpStatusCode.BadRequest) - Content = new
StringContent("id3 not found"),
ReasonPhrase = "product id not exist."
}); - }
- return
p; - }
- }
6.
其它配置说明
6.1
Mvc前端Web.Config 配置
- <</SPAN>system.web>
- <</SPAN>compilation debug="true" targetFramework="4.5">
- <</SPAN>assemblies>
- <</SPAN>add assembly="System.Web.Http.Data.Helpers,
Version=4.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" /> - </</SPAN>assemblies>
- </</SPAN>compilation>
- <</SPAN>httpRuntime targetFramework="4.5" />
- <</SPAN>authentication mode="Forms">
- <</SPAN>forms loginUrl="~/Account/Login" defaultUrl="~/Home/Index" protection="All" timeout="90" name=".AuthCookie"></</SPAN>forms>
- </</SPAN>authentication>
- <</SPAN>machineKey validationKey="3FFA12388DDF585BA5D35E7BC87E3F0AB47FBBEBD12240DD3BEA2BEAEC4ABA213F22AD27E8FAD77DCFEE306219691434908D193A17C1FC8DCE51B71A4AE54920"
decryptionKey="ECB6A3AF9ABBF3F16E80685ED68DC74B0B13CCEE538EBBA97D0B893139683B3B"
validation="SHA1" decryption="AES" /> - </</SPAN>system.web>
machineKey节点配置,是应用于对用户ticket数据加密和解密。
6.2
WebApi服务端Web.Config配置
- <</SPAN>system.web>
- <</SPAN>machineKey validationKey="3FF112388DDF585BA5D35E7BC87E3F0AB47FBBEBD12240DD3BEA2BEAEC4ABA213F22AD27E8FAD77DCFEE306219691434908D193A17C1FC8DCE51B71A4AE54920"
decryptionKey="ECB6A3AF9ABBF3F16E80685ED68DC74B0B13CCEE538EBBA97D0B893139683B3B"
validation="SHA1" decryption="AES" /> - </</SPAN>system.web>
machineKey节点配置,是应用于对用户ticket数据加密和解密。
7.
总结
Web系统的用户登录及页面操作权限验证在处理逻辑上比较复杂,需要考虑到Form认证、匿名访问,Session和Cookie存储,以及Session和Cookie的过期处理,本文实现了整个权限验证框架的基本功能,供系统架构设计人员以及Web开发人员参考。
Demo项目代码地址:
https://github.com/lgsky/DemoUserAuthorization/
Web用户的身份验证及WebApi权限验证流程的设计和实现的更多相关文章
- [置顶] Web用户的身份验证及WebApi权限验证流程的设计和实现 (不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!!)
转发 http://blog.csdn.net/besley/article/details/8516894 不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!! [ ...
- 转 Web用户的身份验证及WebApi权限验证流程的设计和实现
前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权 ...
- Web用户的身份验证及WebApi权限验证流程的设计和实现 asp.net mvc AllowAnonymous 不起作用, asp.net mvc 匿名访问
原文地址: https://blog.csdn.net/zjlovety/article/details/17095627 前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个 ...
- Web用户的身份验证及WebApi权限验证流程的设计和实现(尾)
5. WebApi 服务端代码示例 5.1 控制器基类ApiControllerBase [csharp] view plaincopy /// /// Controller的基类,用于实现适合业 ...
- Web用户的身份验证及WebApi权限验证流程的设计和实现(续)
4.4 权限属性RequireAuthorizationAttribute [csharp] view plaincopy "font-size:14px;">/// / ...
- SpringAOP01 利用AOP实现权限验证、利用权限验证服务实现权限验证
1 编程范式 1.1 面向过程 1.2 面向对象 1.3 面向切面编程 1.4 函数式编程 1.5 事件驱动编程 2 什么是面向切面编程 2.1 是一种编程范式,而不是一种编程语言 2.2 解决一些特 ...
- 学习总结之 WebApi 用户登录和匿名登录,及权限验证
近些天,看了一些博客园大牛关于webApi项目的的文章,也有请教师兄一些问题,自己做了个Demo试了试,收获甚多.感谢感谢,下面是我一些学习的总结,如若有错的地方请多多指教!! WebApi登陆与身份 ...
- 简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)
前言: shiro因为其简单.可靠.实现方便而成为现在最常用的安全框架,那么这篇文章除了会用简洁明了的方式讲一下基于spring的shiro详细配置和登录注销功能使用之外,也会根据惯例在文章最后总结一 ...
- [Abp 源码分析]十二、多租户体系与权限验证
0.简介 承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限校验的. 1.多租户的 ...
随机推荐
- postgresql:pgadmin函数调试工具安装过程
通过安装第三方插件pldebugger,可实现在pgadmin客户端对函数设置断点.调试,具体过程如下: 1.下载pldebugger安装包:http://git.postgresql.org/git ...
- PHP格式化显示文件大小函数
用filesize() 函数可以返回文件的大小,可是返回值是以字节(B)为单位的,看起来不方便.怎么让它根据文件的大小自动以KB.MB.GB为单位显示呢,用下面这个函数就可以实现了. <?php ...
- 第2月第6天 iOS 运行时添加属性和方法
http://blog.csdn.net/meegomeego/article/details/18356169 第一种:runtime.h里的方法 BOOL class_addProperty(Cl ...
- Nginx反向代理+keepalived
环境两台LB(nginx).两台web(nginx/apache都行) 安装httpd web01 [root@web01 /]# /etc/init.d/iptables stop iptables ...
- 编译Android源码
编译版本要求 基本安装环境 ubuntu 14.04 64 sudo apt-get install git-core gnupg flex bison gperf build-essential \ ...
- [转]MyEclipse 里查看jar文件源码
在开发过程中,有时候需要查看jar文件的源码,这里讲解如何设置. 选中某一个jar文件,如我这里选中的是struts2-core-2.1.6.jar,然后右键-->Properties--&g ...
- nginx配置文件或目录404和403
对于Nginx web目录下的文件,如果不想用户访问那么可以配置返回404或者403状态,默认情况下对于目录来说,如果目录下没有默认文档,那么默认返回是403,也就是不允许查看目录列表,但是如果知道静 ...
- 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 ...
- Swift - UIColor16进制编码与RGB格式互相转换
Swift UIColor 16进制编码转换RGB : 由于UI出图的时候,通常给的是16进制的编码颜色,我们在开发的时候需要将它转换为RGB格式,现在给出两种代码片段. 一.对UIColor进行扩展 ...
- Android平台下OpenCV移植与使用---基于C/C++
在<Android Studio增加NDK代码编译支持--Mac环境>和<Mac平台下Opencv开发环境搭建>两篇文章中,介绍了如何使用NDK环境和Opencv环境搭建与测试 ...