.net中的认证(authentication)与授权(authorization)

http://kb.cnblogs.com/page/72452/\


用Membership/Role做过asp.net开发的朋友们,看到这二个接口的定义,应该会觉得很眼熟,想想我们在Asp.Net页面中是如何判断用户是否登录以及角色的?

HttpContext ctx = HttpContext.Current;
if (ctx.User.Identity.IsAuthenticated && ctx.User.IsInRole("管理员"))


The type of ctx.User is IPrincipal.


-------------------------

Thread.CurrentPricinpal= ; //GenericIdentity

_principal.Identity.Name;
_principal.Identity.IsAuthenticated;
_principal.IsInRole("管理员");
_principal.IsInRole("网站会员");


我们知道:每个程序不管它是不是多线程,总归是有一个默认的主线程的。所以只要把主线程的CurrentPrincipal与登录后的_principal关联起来后,其它任何窗体,都可以直接用它来做判断


----login

//建立表单验证票据
FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, user, DateTime.Now, DateTime.Now.AddMinutes(30), true, "管理员,会员", "/");

//使用webcongfi中定义的方式,加密序列化票据为字符串
string HashTicket = FormsAuthentication.Encrypt(Ticket);


//将加密后的票据转化成cookie
HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket);

//添加到客户端cookie
Context.Response.Cookies.Add(UserCookie);


---- logout

FormsAuthentication.SignOut();


----

/// <summary>
/// 每个aspx页面要求认证时被触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
HttpContext _ctx
= HttpContext.Current;
if (_ctx.User != null)
{
if (_ctx.User.Identity.IsAuthenticated == true) //认证成功的用户,才进行授权处理
{
FormsIdentity _Identity
= (FormsIdentity)_ctx.User.Identity;
string[] Roles = _Identity.Ticket.UserData.Split(','); //将角色字符串,即login.aspx.cs中的“管理员,会员”,变成数组
_ctx.User = new GenericPrincipal(_Identity, Roles); //将带有角色的信息,重新生成一个GenericPrincipal赋值给User,相当于winform中的Thread.CurrentPrincipal = _principal
}
}

}



------

<authentication mode="Forms">
<forms
name=".ASPXAUTH"
loginUrl
="login.aspx"
timeout
="30"
path
="/"
requireSSL
="false"
domain
="">
</forms>
</authentication>


每个aspx页面被请求时,总会附带一个HttpContext上下文,可以用它来找回一些前世的记忆,而且文章最开头提到了 HttpContext.Current.User本身就是IPrincipal





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值