webapi 访问权限
最近在做一个项目,前台使用的是angularjs,后台使用的是webapi。webapi不需要登陆,只需要知道方法就能直接访问,这个就比较郁闷了。因为之前也没有做过权限控制的问题,百度搜到了不少,但是都不能用,只能自己解决了,后来终于找到了一种可以实现的方法,只是不知道好不好,希望有人看到能给个答案。实现方法如下:
1、根据登陆信息(用户名,密码之类的)去数据库查询到用户信息,以及用户所有的权限(权限由在增加用户的时候分配)。
2、建立FormsAuthenticationTicket,并把用户信息保存到缓存中,并返回登陆结果及一个token(唯一标识),userRole是一个需要返回的信息实体类。
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
2,
list[0].USERID,
DateTime.Now,
dateCookieExpires,
false,
new JavaScriptSerializer().Serialize(userRole)-------权限(后面用到)
);
string encTicket = FormsAuthentication.Encrypt(ticket);
HttpRuntime.Cache.Add(userRole.TOKEN, encTicket, null, DateTime.Now.AddDays(7), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Default, null);------------保存到缓存中,也可以存到数据库
return Json(userRole);
3、把token保存到本地 localStorage.setItem("token",userRole.TOKEN);
4、创建一个全局注入器,每次访问的时候,可以自动在header中带入token
.factory("httpInjector",['$q','$injector',function($q,$injector){var httpInterceptor = {'responseError' : function(response) {// ...... return $q.reject(response);},'response' : function(response) {if (response.status == 21000) {// console.log('do something...'); }return response || $q.when(response);},'request' : function(config) {config.headers = config.headers || {};if (localStorage.token) {config.headers.token = localStorage.getItem("token");// config.headers['X-Access-Token'] = $localStorage.token; };return config || $q.when(config);return config;},'requestError' : function(config){// ...... return $q.reject(config);}};return httpInterceptor;
}])
5、把注入器配置到config中
.config(["$ionicConfigProvider",'$httpProvider', function ($ionicConfigProvider,$httpProvider) {$httpProvider.interceptors.push('httpInjector'); }])
6、创建一个过滤器TestFilter,继承AuthorizationFilterAttribute,重写方法
public override void OnAuthorization(HttpActionContext actionContext)-------重写授权方法 {
if (HttpContext.Current.Request.Headers["token"] != null)
{
string token = HttpContext.Current.Request.Headers["token"].ToString();---------获取前台传过来的token if (HttpRuntime.Cache.Get(token) != null)
{
------------根据token到缓存中取出用户信息。
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(HttpRuntime.Cache.Get(token).ToString());
if (ticket != null)
{
USER_ROLE userRole = new JavaScriptSerializer().Deserialize<USER_ROLE>(ticket.UserData);
string[] roles = new string[] { };--------取出用户权限组成数据
IIdentity identity = new FormsIdentity(ticket);-------------标识用户的身份验证的类型
IPrincipal principal = new GenericPrincipal(identity, roles); ---------当前用户标识 HttpContext.Current.User = principal;----------- 为当前 HTTP 请求设置安全信息。
}
}
}
}
7、把自定义的过滤器注册到webapiconfig中,注册后每次webapi请求会先经过过滤器
config.Filters.Add(new TestFilter());
8、方法或控制器上添加权限限制 [Authorize(Roles = "TEST")]
到此完成,没有此权限的用户就无法访问此方法。
为什么要返回token到前台,然后把用户信息保存到缓存中呢?是因为对于webapi来说,每次的访问都是一个新的请求,
之前的登陆信息在下次访问的时候就请求不到了,cookie和session也访问不到,所以信息保存到了缓存中(保存到数据库也可以
但是请求太频繁)。根据token,找到对应的用户信息,取出用户信息后赋给当前请求用户,当前用户才有访问权限。
webapi 访问权限相关推荐
- 未获得计算机访问权限,如何获取文件夹的访问权限
有些系统文件夹打不开,显示信息"拒绝你访问该文件夹",有点让人摸不着头脑,明明我是管理员账号,明明整台电脑都是我的,你凭什么不让我访问呢,原来系统内是有比较复杂的权限分配的,我们可 ...
- linux进入节点权限,一种基于索引节点的Linux访问权限控制方法与流程
本发明涉及计算机领域,尤其涉及一种基于索引节点的Linux访问权限控制方法. 背景技术: 传统的Linux访问控制方式是DAC(Discretionary Access Control,自主访问控制) ...
- java平台类成员访问修饰符_JAVA类的修饰符及访问权限
1.类 外部类 class前的修饰符只能有public final abstrct 无(默认) :同包可见 (Eclipse中选择package) 内部类 class前的修饰符有 ...
- Java访问权限(详尽版)
Java中的访问权限一共有四种:public .protected . 默认的 .private(访问范围由大到小): 先说public和private这两种,因为这两种最容易理解: public:在 ...
- Solidity基础入门知识(十)函数的访问权限和可见性
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 下面来继续介绍作为一个分布式网络语言所特有的internal和external这两种不同的函数调用方式,以及So ...
- Java访问权限控制
面向对象的核心思想之一就是封装,只把有限的方法和成员公开给别人,这也是迪米特法则的内在要求,是外部调用方对方法体内的实现细节知道得尽可能少. 如何实现封装呢? 需要使用某些关键字来限制外部对类内属性和 ...
- win7访问不了服务器共享文件夹权限设置,win7系统开启共享文件夹访问权限的操作方法...
很多小伙伴都遇到过对win7系统开启共享文件夹访问权限进行设置的困惑吧,一些朋友看过网上对win7系统开启共享文件夹访问权限设置的零散处理方法,并没有完完全全明白win7系统开启共享文件夹访问权限是如 ...
- java 权限修饰符大小_Java中访问权限修饰符public protected private, 缺省默认权限的用法总结...
1.访问权限符: (1)public: 对于成员来说:任何其他类都可以访问它们,不管在同一个包中还是在另外的包中. 对于类来说: 也是一样. (2)friendly: 对于成员老说:如果一个类的成员没 ...
- java override 访问权限_java 重写(Override)的规则
遵循的规则: [1]访问修饰符的限制一定要不小于被重写方法的访问修饰符 比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记Public修饰符,出错的原因就是:没有加 ...
最新文章
- C#PDF转Word
- MyBatis 实践 -动态SQL/关联查询
- 线程同步--条件变量
- SAP Spartacus CmsPage的加载逻辑
- linux获得系统时间 c,linux c 获取系统时间
- 微软将开放神经网络交换格式贡献给 Linux 基金会
- android ndk 段错误,android crash之段错误原因及分析方法
- Oracle的distinct关键字
- 面试技巧:16个经典面试问题回答思路(转)
- a+aa+...+aaa..aa表达式输出
- GNS3各种IOS下载
- 光(复振幅)在自由空间中传播的matlab仿真——傅里叶光学方法
- 推荐:Redis桌面管理工具RedisDesktopManager
- 淘宝封杀返现模式 淘宝客返利网站模式遇挑战
- vue3 - 23.h函数 / 函数式编程
- EasyRecovery2023重新找回丢失的文件数据恢复软件
- c语言求佩尔方程的解,佩尔方程
- scratch编程——画笔模块画各种同心图案
- 视频转换格式该如何操作
- 51nod1431 快乐排队
热门文章
- MSR145WD无线数据记录仪对制药仓库进行监测
- 网易编程题 游历魔法王国 (Python)
- linux内存非线性映射到文件,Linux 4.x 内核空间 FIXUP 固定映射和临时映射虚拟内存...
- 机器学习之算法部分(算法篇1)
- 全球及中国BOPET盖膜行业研究及十四五规划分析报告
- lua语言入门学习(二)lua语言的特点及注意事项
- lua语言入门学习(八)项目初体验之玩家事件(2)
- scratch开发环境搭建与打包exe
- sockaddr_in结构体的说明(成员:sin_family、sin_addr、sin_zero)
- Zeus Web服务器生成CSR文件的方法