MVC SSO登陆 的麻烦事~
前段时间用MVC + Redis 做session搞了个简单的单点登录Web站。真是日了狗的问题多。
今天正好睡不着,做个备忘笔记>_<
实现方法很简单,无非就是从重载个Controller或 做一个ActionFilterAttribute就可以达到目的。
下面贴一个Controller的代码实现,ActionFilterAttribute实现方式类似:
这里我为了图方便用了servicestack.redis 虽然最新的免费版本 有很大的性能限制(真坑爹)。
两个Controller 类,Base用于在Action执行前填充的Account信息,一个要求必须登陆,否则调到SSO
PS:可做小修改,例如带Token时二次重定向刷新页面或是将Token存入Cache。
public class BaseAccountController : Controller
{
protected RedisHelper.RedisHelper redisHelper { get; private set; }
protected readonly static String TokenKeyCookie = "QTMAccountTokenCookie"; public BaseAccountController()
{
redisHelper = new RedisHelper.RedisHelper();
} ~BaseAccountController()
{
if (redisHelper != null)
{
redisHelper.Dispose();
}
} protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var cookie = filterContext.HttpContext.Request.Cookies[TokenKeyCookie];
String token = filterContext.HttpContext.Request.QueryString["Token"]; if (cookie != null)
{
token = cookie.Value;
var accountIndex = redisHelper.Get<AccountIndex>(token);
ViewBag.CurrentAccount = accountIndex;
}
else if (!String.IsNullOrWhiteSpace(token))
{
var accountIndex = CreateTokenCookie(token);
ViewBag.CurrentAccount = accountIndex;
}
} /// <summary>
/// 创建Token令牌的本地Cookie
/// </summary>
/// <param name="Token">Token令牌</param>
/// <returns></returns>
protected AccountIndex CreateTokenCookie(string Token)
{
var accountIndex = redisHelper.Get<AccountIndex>(Token); //判断是否 为有效的Token令牌
if (accountIndex == null)
{
return null;
} //生产Token令牌的Cookie
var token_cookie = new HttpCookie(TokenKeyCookie, Token)
{
HttpOnly = true,
Secure = FormsAuthentication.RequireSSL,
Path = "/",
Expires = DateTime.Now.AddYears()
}; HttpContext.Response.Cookies.Add(token_cookie); return accountIndex;
}
在
/// <summary>
/// 控制器的 所有Action必须 持有 有效的 Account Token令牌。
/// </summary>
public class AccountAuthenController : BaseAccountController
{ public AccountAuthenController()
: base()
{
} ~AccountAuthenController()
{
if (redisHelper != null)
{
redisHelper.Dispose();
}
} protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
String token = filterContext.HttpContext.Request.QueryString["Token"];
var cookie = filterContext.HttpContext.Request.Cookies[TokenKeyCookie]; if (cookie == null)
{
if (!String.IsNullOrWhiteSpace(token))
{
//当有返回新的Token令牌时,创建一个新的Token本地Cookie
var accountIndex = CreateTokenCookie(token); if (accountIndex == null)
{
filterContext.HttpContext.Response.Redirect(String.Format(ActionUri.Login, filterContext.HttpContext.Request.Url.AbsoluteUri));
}
}
else
{
filterContext.HttpContext.Response.Redirect(String.Format(ActionUri.Login, filterContext.HttpContext.Request.Url.AbsoluteUri));
}
}
else
{
token = cookie.Value;
var accountIndex = redisHelper.Get<AccountIndex>(token); if (accountIndex == null)
{ //无效的Token Cookie
filterContext.HttpContext.Response.Cookies[TokenKeyCookie].Expires = DateTime.Now.AddYears(-);
filterContext.HttpContext.Response.Redirect(String.Format(ActionUri.Login, filterContext.HttpContext.Request.Url.AbsoluteUri));
}
} base.OnActionExecuting(filterContext);
} #region Private Method #endregion
}
MVC SSO登陆 的麻烦事~的更多相关文章
- ASP.NET MVC SSO单点登录设计与实现
实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...
- ASP.NET MVC SSO单点登录设计与实现(转载)
实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...
- ASP.NET MVC SSO 单点登录设计与实现
实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...
- MVC4/5+jquery+bootstrap样式+dataTables+linq+WCF+EF6后台和前台的框架集合!好蛋疼哦!数据库支持MYSQL 和MSSQL,oracle。集成腾讯企业邮箱收邮件同步用户SSO登陆等功能。
花费了我好多心血,才做出来,下个项目准备用这个框架! 大家有没有做这方面的可以交流一下! 花费了我好多心血,才做出来,下个项目准备用这个框架! 大家有没有做这方面的可以交流一下! 花费了我好多心血,才 ...
- Sahi (3) —— 压力测试Load Test以CAS SSO登陆场景为例(103 Tutorial)
Sahi (3) -- 压力测试Load Test以CAS SSO登陆场景为例(103 Tutorial) jvm版本: 1.8.0_65 sahi版本: Sahi Pro 6.1.0 参考来源: S ...
- 新浪微博SSO登陆机制
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- MVC基本登陆与验证码功能实现
一.基本登陆实现与验证码功能实现,该功能是和spring.net功能集合使用的,因为后面要用到验证是否处于登陆状态 1. 先构建一个登陆页面 @{ Layout = null; } <!DOCT ...
- .NET MVC中登陆授权过滤器的使用
1.写个类LoginAuthorityAttribute,继承自AuthorizeAttribute using System; using System.Collections.Generic; u ...
- 新浪微博SSO登陆机制(转载)
原文地址: http://www.cnblogs.com/AloneSword/p/3840548.html 最近在使用sina微博时,经常性交替使用 weibo.com 和 t.sina.cm.cn ...
随机推荐
- WeCenter二次开发教程(一):熟悉模板结构
<1>程序文件目录介绍: app – 应用目录 models – 模型目录 plugins – 插件目录 static – 静态文件 system – 系统目录 views – 模板目录 ...
- css 伪元素分享!!!
最近接触到的css 伪元素觉得还算不错 分享下: 1.清楚内盒浮动设置: ;} .back_list ul:after{;visibility: hidden;}/*清楚内盒浮动设置*/ 2.伪元素a ...
- CentOS7下zip解压和unzip压缩文件
1.安装zip.unzip应用. yum install zip unzip
- java selenium (九) 常见web UI 元素操作 及API使用
本篇介绍我们如何利用selenium 来操作各种页面元素 阅读目录 链接(link) <div> <p>链接 link</p> <a href=" ...
- CodeForces #363 div2 Vacations DP
题目链接:C. Vacations 题意:现在有n天的假期,对于第i天有四种情况: 0 gym没开,contest没开 1 gym没开,contest开了 2 gym开了,contest没开 3 ...
- 在Heroku上,安装Wordpress
其實在 Heroku 上安裝 Wordpress 不會很難,不過閱讀之前,你可能先要知道 Heroku 與 git 的基本操作,建議可以先參考以下網站用 Heroku 架設 Wordpress 網站 ...
- web前端,移动开发规范概述
以下规范建议,均是Alloyteam在日常开发过程中总结提炼出的经验,规范具备较好的项目实践,强烈推荐使用 字体设置 使用无衬线字体 body { font-family: "Helveti ...
- 完全卸载oracle11g步骤【转】
重装oralce,每次都很蛋疼.找了个比较全的步骤.留作备份. 完全卸载oracle11g步骤:1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务.2 ...
- sasasa
/***************************************************************************************** 文件:app_to ...
- c语言问卷
1.你对自己的未来有什么规划?做了哪些准备? 答:关于未来我想从事设计网页.做小游戏或者app的工作,因为是金融服务外包方向,也许也会进入银行或者证券公司管理银行系统.让英语更近一层,可进入外企工作. ...