锁定老帖子 主题:基于角色的认证和授权
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2008-12-03
今天看了codeproject上面的一片文章,感觉不错。作者主要是用form authentication 实现了基于角色的认证。功能还算可以,基本可以代替MS 的Membership了,但是没有membership那么庞大。做一个基本的应用是够用了。
翻译一下大概内容,大意记录如下:
作者实现了4个网页,功能是:添加用户,给用户指定角色,删除角色,管理角色。 The Classes OverviewThere are 4 classes: The User class
The Role class
The SitePrincipal class (implements the IIPrincipal Interface)
The SiteIdentity class (implements the IIdentity Interface)
Enabling Forms Authentication为了实现ASP.NET Forms 认证, web.config 文件配置如下: <configuration>
<system.web>
<authentication mode="Forms">
<forms name="RolesBasedAthentication"
path="/"
loginUrl="/Login.aspx"
protection="All"
timeout="30">
</forms>
</authentication>
</system.web>
</configuration>
forms的name属性指定了浏览器的cookie名字,默认的名字是.aspxauth,但是当在相同的服务器中有好几个应用程序,就应当一个不同的名字。loginurl是登录页面。timeout指定了cookie的有效时间,单位是分钟。当然了,对于要保存的cookie就无效了。protection是cookie的保存方法:all意味着数据会被加密和验证。别的可以指定的值包括:none,encryption,validation.
表单认证一旦被指定,每次用户请求一个页面,表单就要检查浏览器的cookie值。如果找到了,user identify就会以FormsIdentity类的形式保存在cookie中,这个类包含了认证用户的如下信息: AthenticationType - returns the value Forms IsAthenticated - returns a boolean value indicating where the user was authenticated Name - Indicates the name of an authenticated user 因为FormsIdentity类只包含了用户的name属性,但是我们往往需要大量的信息,而不止于Name。因此我就写了这个SiteIdentity类,它实现了IIdentity接口,包含了认证用户的更多信息。
Creating the Login Page登录页面包含两个文本框让用户输入电子邮件和密码,也许还可以放一个选项框,让用户选择是否要保持永久cookie,最后放一个submit按钮,Onclick事件处理如下: private void Submit_Click(object sender, System.EventArgs e) { // call the ValidateLogin static method to // check if the email and password are correct // if correct the method will return a new user else return null SitePrincipal newUser = SitePrincipal.ValidateLogin(Email.Text, Password.Text); if (newUser == null) { ErrorMessage.Text = "Login failed for " + Email.Text; ErrorMessage.Visible = true; } else { // assign the new user to the current context user Context.User = newUser; // set the cookie that contains the email address // the true value means the cookie will be set persisted FormsAuthentication.SetAuthCookie( Email.Text, true ); // redirect the user to the home page Response.Redirect("Default.aspx"); } }
Authenticating User On Every Request主要是实现了一个所有页面都要继承的基类,所有继承自它的页面都会包含我们自定义的SiteProcipal实例信息: public class PageBase: System.Web.UI.Page { public PageBase() { } protected override void OnInit(EventArgs e) { base.OnInit(e); this.Load += new System.EventHandler(this.PageBase_Load); } private void PageBase_Load(object sender, System.EventArgs e) { if (Context.User.Identity.IsAuthenticated) { if (!(Context.User is SitePrincipal)) { SitePrincipal newUser = new SitePrincipal( Context.User.Identity.Name ); Context.User = newUser; } } } }
以后所有的页面都要继承自此页,而非System.Web.UI.Page,因此,如果此时想得到用户的信息就简单了:
if (Context.User.Identity.IsAuthenticated) { string name = ((SiteIdentity)Context.User.Identity).FullName; string email = ((SiteIdentity)Context.User.Identity).Email; string password = ((SiteIdentity)Context.User.Identity).Password; string userID = ((SiteIdentity)Context.User.Identity).UserID; }
或者你可以查看当前用户的角色:
if (Context.User.Identity.IsAuthenticated) { // if user is not in the Site Admin role, // he/she will be redirected to the login page if (!((SitePrincipal)Context.User).IsInRole("Site Admin")) Response.Redirect("Login.aspx"); } The Demo Application下载地址如下:
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
浏览 3169 次