惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
C
Check Point Blog
I
InfoQ
A
About on SuperTechFans
Engineering at Meta
Engineering at Meta
月光博客
月光博客
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
Y
Y Combinator Blog
博客园 - Franky
博客园_首页
罗磊的独立博客
量子位
美团技术团队
T
The Blog of Author Tim Ferriss
Last Week in AI
Last Week in AI
大猫的无限游戏
大猫的无限游戏
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Martin Fowler
Martin Fowler
博客园 - 叶小钗
aimingoo的专栏
aimingoo的专栏

博客园 - 晰雨的天空

换工作了。去微软了。可惜是vender,但总算也是有机会去sigma上班了。 本人对于magicajax使用说明的翻译,还有很多不足和错误。欢迎大家指正. 跳到新页面,刷新框架. - 晰雨的天空 - 博客园 datagrid 超连接弹出新窗体 - 晰雨的天空 - 博客园 转 datagrid的操作 excel c# 访问excel textbox 只能输入数字控制 - 晰雨的天空 - 博客园 静态构造器和静态属性的执行顺序 索引器的简单使用 参数定义符号params 使用 委托和事件 C#中废弃一个方法小技巧 (转自terrylee)只为收藏 复制表 , 拷贝表 怎样使按钮响应回车键(转) 路过的朋友都来看看,说说.程序员,什么是终点...哪里有方向 一道c#题.请高手给个答案 Session.Abandon和Session.Clear有何不同? C#中的const和readonly
身份验证票 和 form验证 - 晰雨的天空
晰雨的天空 · 2006-03-24 · via 博客园 - 晰雨的天空

using System.Web.Security;

if((TextBox1.Text.Trim()=="a") && (TextBox2.Text.Trim()=="b"))
   {
    FormsAuthentication.SetAuthCookie(TextBox1.Text, false);
   }   
   else
   {
      HttpContext.Current.Response.Redirect(FormsAuthentication.GetRedirectUrl(TextBox1.Text, false), true);
      自动跳到Default.aspx
   }

身份验证票
构建基于forms的验证机制过程如下:
1,设置IIS为可匿名访问和asp.net web.config中设置为form验证
2,检索数据存储验证用户,并检索角色(如果不是基于角色可不用)
3,使用FormsAuthenticationTicket创建一个Cookie并回发到客户端,并存储
角色到票中,如:
FormsAuthentication.SetAuthCookie(Username,true | false)
cookies保存时间:
HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName].Expires=DateTime.Now.AddDays(1)

如果需要存储角色,采用:
FormsAuthenticationTicket authTicket = new
FormsAuthenticationTicket(
1, // 版本号。
txtUserName.Text, // 与身份验证票关联的用户名。
DateTime.Now, // Cookie 的发出时间。
DateTime.Now.AddMinutes(20),// Cookie 的到期日期。
false, // 如果 Cookie 是持久的,为 true;否则为 false。
roles ); // 将存储在 Cookie 中的用户定义数据。
roles是一个角色字符串数组
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密

存入Cookie
HttpCookie authCookie =
new HttpCookie(FormsAuthentication.FormsCookieName,
encryptedTicket);

Response.Cookies.Add(authCookie);

4,在Application_AuthenticateRequest事件中处理程序中(Global.asax)中,使用
票创建IPrincipal对象并存在HttpContext.User中
代码:
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);//解密
string[] roles = authTicket.UserData.Split(new char[]{';'});//根据存入时的格式分解,;或|....
Context.User = new GenericPrincipal(Context.User.Identity, Roles);//存到HttpContext.User中

具体实现

Web.config文件
加入节点,name为COOKIE名称,loginUrl为没有通过验证跳转的地址
<system.web>


loginUrl="login.aspx" protection="All" path="/" timeout="40"/>

设置目录访问 path为目录名,roles为票据中的角色名
发现网上的都说要单独一个WEB.CONFIG文件放在目录中,但实际在根目录中设置即可,单个文件也一样


<system.web>



Global.asax文件
Application_AuthenticateRequest事件中加入

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch(Exception ex)
{
return;
}

string[] roles = authTicket.UserData.Split(new char[]{','});//如果存取多个角色,我们把它分解

FormsIdentity id = new FormsIdentity( authTicket );

GenericPrincipal principal = new GenericPrincipal(id, roles);
Context.User =principal;//存到HttpContext.User中

    }

原理,将用户角色信息保存在票据中,通过Global.asax,WEB.CONFIG中的设置,判断角色的权限

  1. 登陆

1)自定义身份验证票据


2)使用系统的验证票据

//为给定的 userName、createPersistentCookie 和 strCookiePath 创建身份验证票,并将其附加到 Cookie 的传出响应集合。它不执行重定向。
FormsAuthentication.SetAuthCookies(userName,isPersistent,cookiePath);


2.  验证
     

3. 退出

FormsAuthentication.SignOut();
Session.Abandon();