自定义认证管理器,分为两级:1、登陆认证。2、权限认证。权限主要是用户、角色、角色用户关系、功能(系统资源)、角色功能关系,5部分决定用户的权限(视图)。

两层认证都通过后,更新session的最新交互时间,session有效期30分钟。

每个请求头部必须另加sessionID、token,加sessionID的目的是先根据ID加快检索,再和token对比,是否超时、退出等。

     class WmsServiceAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{
var via = operationContext.IncomingMessageProperties.Via;
var ctx = WebOperationContext.Current;
var id = ctx.IncomingRequest.Headers["id"];
var token = ctx.IncomingRequest.Headers["token"]; // 若不是登录接口
if (via.Segments.Count(x => x.ToLower().Equals("login") || x.ToLower().Equals("logout")) == )
{
long sessionId = ;
if (!long.TryParse(id, out sessionId))
{
// 若提供的sessionID无效,则登陆认证失败=401
ctx.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
return false;
}
// 若提供的ID 和 token无效,则登陆认证失败=401
var userSvc = new UserSvc();
var session = userSvc.GetSession(sessionId, token);// session有效期30分钟无动作
if (session == null || session.logout_time != null
|| session.user_id == null || session.update_time < DateTime.Now.AddMinutes(-))
{
ctx.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
return false;
}
userSvc.UpdSession(sessionId, token);// 更新最后一次交互时间 // 验证权限是否足够,否则禁止访问=403
var userAuths = userSvc.GetUserAuths(session.user_id.Value);
bool isAuth = via.Segments.Any(segment => userAuths.Count(x => x.fun_name.ToLower().Equals(segment.ToLower())) > );
if (!isAuth)
{
ctx.OutgoingResponse.StatusCode = HttpStatusCode.Forbidden;
return false;
}
}
return true;
}
}

宿主绑定认证管理器:

         static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(Wms.Service.WmsService));
host.Authorization.ServiceAuthorizationManager = new WmsServiceAuthorizationManager();
host.Open();
Console.WriteLine("已启动");
Console.WriteLine("回车键退出");
Console.ReadLine();
}

angular请求前统一添加令牌,和认证失败后重定向、及权限不足提示:

     app.factory('interceptor', function ($q, $location) {
return {
request: function (config) {
if (config.url.indexOf('/login/') === -1 && sessionStorage.session) {
var session = JSON.parse(sessionStorage.session);
config.headers['id'] = session.id;
config.headers['token'] = session.token;
} // 禁止HTML缓存
if(config.url.indexOf('.html') > 0){
//var nocache = '?v=' + new Date().getTime();
var idx = config.url.indexOf('?v=');
if(idx === -1)
config.url += appVersion;
else{
config.url = config.url.substr(0, idx) + appVersion;
}
}
return config || $q.when(config);
},
response: function (response) {
if (response.config.url.indexOf('service') > -1) {
//todo 预处理请求结果
}
return response || $q.when(response);
},
responseError: function (response) {
if (response.status === 401) {// If our response status is unauthorized
sessionStorage.removeItem('session');
layer.msg('认证失败,重新登录!');
$location.path('/main/index');// Redirect to the login screen
}else if (response.status === 403) {// If our response status is Forbidden
layer.msg('认证失败,权限不足');
}else {
return $q.reject(response);// Reject our response
}
}
};
});

添加拦截器

 $httpProvider.interceptors.push('interceptor');

wcf 登录认证 angular 认证重定向的更多相关文章

  1. DRF接入Oauth2.0认证[微博登录]报错21322重定向地址不匹配

    DRF接入Oauth2.0认证[微博登录]报错21322重定向地址不匹配 主题自带了微博登陆接口,很简单的去新浪微博开放平台创建了网页应用,然后把APP ID和 AppSecret填好后,以为大功告成 ...

  2. ASP.NET Identity登录原理 - Claims-based认证和OWIN

    MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN 在Membership系列的最后一篇引入了ASP.NET Identity,看到大家对它还是挺感兴趣 ...

  3. OpenWRT下实现Portal认证(WEB认证)

    首先简单介绍一下什么是Portal认证,Portal认证,通常也会叫Web认证,未认证用户上网时,设备强制用户登录到特定站点,用户可以免费访问其中的服务.当用户需要使用互联网中的其它信息时,必须在门户 ...

  4. 翻译:WebApi 认证--用户认证Oauth解析

        The Web API v2用户认证模板提供了流行的应用用户认证场景,如.使用本地帐号的用户名密码认账 (包括创建用户.设置和修改密码)以及使用第三方的认证方式,如facebook,googl ...

  5. drf框架 - 三大认证组件 | 认证组件 | 权限组件 | 频率组件

    RBAC 基于用户权限访问控制的认证 - Role-Based Access Control Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为 三表规则.五表规则,Django采用 ...

  6. drf三大认证:认证组件-权限组件-权限六表-自定义认证组件的使用

    三大认证工作原理简介 认证.权限.频率 源码分析: from rest_framework.views import APIView 源码分析入口: 内部的三大认证方法封装: 三大组件的原理分析: 权 ...

  7. 自学Aruba7.1-Aruba安全认证-WPA2-PSK认证(web页面配置)

    点击返回:自学Aruba之路 自学Aruba7.1-Aruba安全认证-WPA2-PSK认证(web页面配置) 步骤1 建立AP Group,命名为test-group 步骤2  将AP加入到AP G ...

  8. 自学Aruba7.2-Aruba安全认证-Portal认证(web页面配置)

    点击返回:自学Aruba之路 自学Aruba7.2-Aruba安全认证-Portal认证(web页面配置) 步骤1 建立AP Group,命名为testportal-group 步骤2  将AP加入到 ...

  9. 自学Aruba7.4-Aruba安全认证-MAC认证(web页面配置)

    点击返回:自学Aruba之路 自学Aruba7.4-Aruba安全认证-MAC认证(web页面配置) 由于前三节已经讲述了3种如何web页面配置安全认证,MAC认证就不过多讲解重复的步骤. 步骤1  ...

随机推荐

  1. 一个简单的C#+arcgis的非数据库版例子

    1.首先新建一个winform的项目. 2.确保C#工具箱包含ESRI的相关控件,如果没有就需要安装SDK. 如果VS中依旧不存在esri控件解决方案如下,以VS2013为例: (1)打开注册表,定位 ...

  2. Mysql链接字符串问题

    <add key="ConnstringMySql" value="server=xxx.xxx.xxx.xxx;database=YourDatabase;uid ...

  3. [BJ2006] 狼抓兔子

    题目链接:戳我 按理说以dinic\(O(M*N^2)\)的时间复杂度应该是过不去的(呃我也知道这个上界很松).但是最小割确实可以水过去?? 但是本着写正解的精神,我还是学了学平面图和对偶图,跑最短路 ...

  4. 二十一、Node.js-EJS 模块引擎

    初识 EJS 模块引擎 我们学的 EJS 是后台模板,可以把我们数据库和文件读取的数据显示到 Html 页面上面.它是一个第三方模块,需要通过 npm 安装https://www.npmjs.com/ ...

  5. flutter 保存图片到本地

    f'lutter 图片的保存 分为俩步: 1.开启存储图片权限开启权限需要用到permission_handler pubspec 添加 permission_handler: ^3.0.1下载包就可 ...

  6. “全栈2019”Java第二十四章:流程控制语句中决策语句switch下篇

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. “全栈2019”Java第十六章:下划线在数字中的意义

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. 【maven】---聚合和继承

    前言 自从我知道写maven实战这本书的作者长得随心所欲后,我再拿起这本书真心的不想看前言了.下面分享一下maven中的所谓的聚合和继承. 内容 下文中的子本指的是:多个maven项目. 父本指的是: ...

  9. 多继承c3算法

    一.mro mro即 method resolution order (方法解释顺序),主要用于在多继承时判断属性的路径(来自于哪个类). print(类.mro)得到属性路径按继承顺序 在pytho ...

  10. [ActionScript 3.0] 自制简单拾色器

    colorBoard为库中绑定的影片剪辑,colorBoard中包含影片剪辑currColor,文本colorText,影片剪辑close: colorDot为库中绑定的影片剪辑,colorDot中包 ...