最近在做一个项目,前台使用的是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 访问权限相关推荐

  1. 未获得计算机访问权限,如何获取文件夹的访问权限

    有些系统文件夹打不开,显示信息"拒绝你访问该文件夹",有点让人摸不着头脑,明明我是管理员账号,明明整台电脑都是我的,你凭什么不让我访问呢,原来系统内是有比较复杂的权限分配的,我们可 ...

  2. linux进入节点权限,一种基于索引节点的Linux访问权限控制方法与流程

    本发明涉及计算机领域,尤其涉及一种基于索引节点的Linux访问权限控制方法. 背景技术: 传统的Linux访问控制方式是DAC(Discretionary Access Control,自主访问控制) ...

  3. java平台类成员访问修饰符_JAVA类的修饰符及访问权限

    1.类 外部类      class前的修饰符只能有public final abstrct 无(默认) :同包可见  (Eclipse中选择package) 内部类      class前的修饰符有 ...

  4. Java访问权限(详尽版)

    Java中的访问权限一共有四种:public .protected . 默认的 .private(访问范围由大到小): 先说public和private这两种,因为这两种最容易理解: public:在 ...

  5. Solidity基础入门知识(十)函数的访问权限和可见性

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 下面来继续介绍作为一个分布式网络语言所特有的internal和external这两种不同的函数调用方式,以及So ...

  6. Java访问权限控制

    面向对象的核心思想之一就是封装,只把有限的方法和成员公开给别人,这也是迪米特法则的内在要求,是外部调用方对方法体内的实现细节知道得尽可能少. 如何实现封装呢? 需要使用某些关键字来限制外部对类内属性和 ...

  7. win7访问不了服务器共享文件夹权限设置,win7系统开启共享文件夹访问权限的操作方法...

    很多小伙伴都遇到过对win7系统开启共享文件夹访问权限进行设置的困惑吧,一些朋友看过网上对win7系统开启共享文件夹访问权限设置的零散处理方法,并没有完完全全明白win7系统开启共享文件夹访问权限是如 ...

  8. java 权限修饰符大小_Java中访问权限修饰符public protected private, 缺省默认权限的用法总结...

    1.访问权限符: (1)public: 对于成员来说:任何其他类都可以访问它们,不管在同一个包中还是在另外的包中. 对于类来说: 也是一样. (2)friendly: 对于成员老说:如果一个类的成员没 ...

  9. java override 访问权限_java 重写(Override)的规则

    遵循的规则: [1]访问修饰符的限制一定要不小于被重写方法的访问修饰符 比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记Public修饰符,出错的原因就是:没有加 ...

最新文章

  1. C#PDF转Word
  2. MyBatis 实践 -动态SQL/关联查询
  3. 线程同步--条件变量
  4. SAP Spartacus CmsPage的加载逻辑
  5. linux获得系统时间 c,linux c 获取系统时间
  6. 微软将开放神经网络交换格式贡献给 Linux 基金会
  7. android ndk 段错误,android crash之段错误原因及分析方法
  8. Oracle的distinct关键字
  9. 面试技巧:16个经典面试问题回答思路(转)
  10. a+aa+...+aaa..aa表达式输出
  11. GNS3各种IOS下载
  12. 光(复振幅)在自由空间中传播的matlab仿真——傅里叶光学方法
  13. 推荐:Redis桌面管理工具RedisDesktopManager
  14. 淘宝封杀返现模式 淘宝客返利网站模式遇挑战
  15. vue3 - 23.h函数 / 函数式编程
  16. EasyRecovery2023重新找回丢失的文件数据恢复软件
  17. c语言求佩尔方程的解,佩尔方程
  18. scratch编程——画笔模块画各种同心图案
  19. 视频转换格式该如何操作
  20. 51nod1431 快乐排队

热门文章

  1. MSR145WD无线数据记录仪对制药仓库进行监测
  2. 网易编程题 游历魔法王国 (Python)
  3. linux内存非线性映射到文件,Linux 4.x 内核空间 FIXUP 固定映射和临时映射虚拟内存...
  4. 机器学习之算法部分(算法篇1)
  5. 全球及中国BOPET盖膜行业研究及十四五规划分析报告
  6. lua语言入门学习(二)lua语言的特点及注意事项
  7. lua语言入门学习(八)项目初体验之玩家事件(2)
  8. scratch开发环境搭建与打包exe
  9. sockaddr_in结构体的说明(成员:sin_family、sin_addr、sin_zero)
  10. Zeus Web服务器生成CSR文件的方法