前段时间用MVC + Redis 做session搞了个简单的单点登录Web站。真是日了狗的问题多。

今天正好睡不着,做个备忘笔记>_<

实现方法很简单,无非就是从重载个Controller或 做一个ActionFilterAttribute就可以达到目的。

下面贴一个Controller的代码实现,ActionFilterAttribute实现方式类似:

这里我为了图方便用了servicestack.redis 虽然最新的免费版本 有很大的性能限制(真坑爹)。

两个Controller 类,Base用于在Action执行前填充的Account信息,一个要求必须登陆,否则调到SSO

PS:可做小修改,例如带Token时二次重定向刷新页面或是将Token存入Cache。

    
/// <summary>
/// 为所有Action填充Account用户信息
/// </summary>
  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登陆 的麻烦事~的更多相关文章

  1. ASP.NET MVC SSO单点登录设计与实现

    实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...

  2. ASP.NET MVC SSO单点登录设计与实现(转载)

    实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...

  3. ASP.NET MVC SSO 单点登录设计与实现

    实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...

  4. MVC4/5+jquery+bootstrap样式+dataTables+linq+WCF+EF6后台和前台的框架集合!好蛋疼哦!数据库支持MYSQL 和MSSQL,oracle。集成腾讯企业邮箱收邮件同步用户SSO登陆等功能。

    花费了我好多心血,才做出来,下个项目准备用这个框架! 大家有没有做这方面的可以交流一下! 花费了我好多心血,才做出来,下个项目准备用这个框架! 大家有没有做这方面的可以交流一下! 花费了我好多心血,才 ...

  5. 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 ...

  6. 新浪微博SSO登陆机制

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  7. MVC基本登陆与验证码功能实现

    一.基本登陆实现与验证码功能实现,该功能是和spring.net功能集合使用的,因为后面要用到验证是否处于登陆状态 1. 先构建一个登陆页面 @{ Layout = null; } <!DOCT ...

  8. .NET MVC中登陆授权过滤器的使用

    1.写个类LoginAuthorityAttribute,继承自AuthorizeAttribute using System; using System.Collections.Generic; u ...

  9. 新浪微博SSO登陆机制(转载)

    原文地址: http://www.cnblogs.com/AloneSword/p/3840548.html 最近在使用sina微博时,经常性交替使用 weibo.com 和 t.sina.cm.cn ...

随机推荐

  1. zencart産品描述加上錨文本

    首先,函數會遍曆整段描述,假如一段描述裏面有Hermes wallets這個關鍵詞,那麽函數就會對這個關鍵詞加上鏈接,至于鏈接到哪裏,上面數組裏面有,隻要把數組裏面的内容替換你想要的就可以. 那麽在z ...

  2. 生产排产表DL-ZPPR002

    *&---------------------------------------------------------------------* *& Report ZPPR002 * ...

  3. angularjs 嵌套控制器,子控制器访问父控制器

    <pre> http://www.lovelucy.info/understanding-scopes-in-angularjs.html http://blog.csdn.net/jfk ...

  4. CSS3的@keyframes用法详解:

    CSS3的@keyframes用法详解:此属性与animation属性是密切相关的,关于animation属性可以参阅CSS3的animation属性用法详解一章节. 一.基本知识:keyframes ...

  5. Selenium VS QTP

      Selenium系列 QTP 适用结构  B/S结构  C/S.B/S结构 适用人员 有一定代码基础(Java.C#.Python.Ruby) 对编程不是很熟悉的.厌烦了做手工功能测试的.想快速进 ...

  6. Python笔记总结week8

    面向对象第二节 要点: 1. 封装,对象中嵌套对象 2. pickle,load,切记,一定要先导入相关的类 回顾上一节: 面向对象三大特性: 封装.继承.多态(多种类型.多种形态) 关于多态,任意参 ...

  7. java selenium (十四) 处理Iframe 中的元素

    有时候我们定位元素的时候,发现怎么都定位不了. 这时候你需要查一查你要定位的元素是否在iframe里面 阅读目录 什么是iframe iframe 就是HTML 中,用于网页嵌套网页的. 一个网页可以 ...

  8. linux之PATH环境变量

    在linux中,我们发现一些命令在任何目录都能执行,并不会出现找不到这个命令文件的提示,这其中就是PATH变量帮我们定位的!首先我们来查看一下PATH变量 [root@localhost /]# ec ...

  9. #define DELAY_ONE_MICROSECOND (-10) 时间是负数的原因

    以下摘自DOOM的博文<内核同步对象> http://blog.csdn.net/lqk1985/article/details/2541867 “最后一个参数&timeout是一 ...

  10. rocksDB 安装问题简单介绍

    前一段时间准备测试rocksdb,按照帖子和官网的例子,在安装过程中遇到一些问题.这里给出的是在Ubuntu下安装python使用的版本. 首先,要感谢这些帖子对我的帮助: 1:http://tech ...