`
john2007
  • 浏览: 78562 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

基于角色的认证和授权

阅读更多

 

今天看了codeproject上面的一片文章,感觉不错。作者主要是用form authentication 实现了基于角色的认证。功能还算可以,基本可以代替MS 的Membership了,但是没有membership那么庞大。做一个基本的应用是够用了。

 

 

翻译一下大概内容,大意记录如下:

 

作者实现了4个网页,功能是:添加用户,给用户指定角色,删除角色,管理角色。

The Classes Overview

There are 4 classes: User, Role, SitePrincipal and SiteIdentity. I would like to overview the classes' methods and properties here:

The User class

 User() Default parameter less constructor to create a new user
 User(int userID) This constructor gets a userID and looks up the user details from the database
 User(string email) This constructor gets an email and looks up the user details from the database
 GetUsers() This method returns a DataSet of all the users available in the database
 GetRoles() This method returns a DataSet of roles assigned to the current user
 GetUserRoles(int userID) This static method grabs the userID and returns a roles ArrayList assigned to that user
 AddToRole(int roleID) This method assigns a role to the current user
 RemoveFromRole(int roleID) This method removes current user from the role that has been passed by the roleID.
 Add() Adds a new user to the database
 Update() Updates current user information
 Delete() Deletes current user
 UserID Gets/Sets user's id number
 FullName Gets/Sets user's full name
 Email Gets/Sets user's email
 Password Gets/Sets user's password
 Biography Gets/Sets user's biography
 DateAdded Gets/Sets user's registering date

The Role class

 Role() Default parameter less constructor to create a new role
 Role(int roleID) This constructor gets a roleID and looks up the role details from the database
 GetRoles() This method returns a DataSet of all roles available in the database
 Add() Adds a new role to the database
 Update() Updates current role information
 Delete() Deletes current role
 RoleID Gets/Sets role ID number
 RoleName Gets/Sets role name

The SitePrincipal class (implements the IIPrincipal Interface)

 SitePrincipal(int userID) This constructor gets a userID and looks up details from the database
 SitePrincipal(string email) This constructor gets an email and looks up details from the database
 IsInRole() (IIPrincipal.IsInRole()) Indicates whether a current principal is in a specific role
 ValidateLogin() Adds a new user to the database
 Identity (IIPrincipal.Identity) Gets/Sets the identity of the current principal
 Roles Gets the roles of the current principal

The SiteIdentity class (implements the IIdentity Interface)

 SiteIdentity(int userID) This constructor gets a userID and looks up the user details from the database
 SiteIdentity(string email) This constructor gets an email and looks up the user details from the database
 AuthenticationType (IIdentity.AuthenticationType) Always returns "Custom Authentication"
 IsAuthenticated (IIdentity.IsAuthenticated) Always returns true
 Name (IIdentity.Name) Gets the name of the current user
 Email Gets the email of the current user
 Password Gets the password of the current user
 UserID Gets the user ID number of the current user

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

    下载地址如下:

     

     

     

     

     

     

     

    分享到:
    评论

    相关推荐

      电镀生产线中西门子S7-300 PLC控制程序详解及其应用

      内容概要:本文详细介绍了应用于电镀生产线的西门子S7-300 PLC控制系统的程序设计、硬件配置以及调试过程中积累的实际经验。主要内容涵盖温度控制、条码记录、行车定位、故障排查等方面的技术细节。文中展示了多个关键功能模块的具体实现方法,如PID温度控制、条码数据处理、行车定位判断等,并分享了一些实用的调试技巧和注意事项。此外,还讨论了硬件配置中的重要细节,如模块地址分配、网络拓扑设计等。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对PLC编程有一定基础的人群。 使用场景及目标:适用于需要深入了解和掌握电镀生产线自动化控制技术的专业人士。目标是帮助读者理解S7-300 PLC在电镀生产线中的具体应用,提高实际项目的开发效率和可靠性。 其他说明:文章不仅提供了详细的程序代码示例,还分享了许多来自一线的真实案例和实践经验,对于解决实际工程中的问题具有很高的参考价值。

      COMSOL仿真中固体超声导波的二维建模与分析:基于汉宁窗调制的200kHz正弦激励信号

      内容概要:本文详细介绍了使用COMSOL Multiphysics进行固体超声导波的二维仿真过程。作者通过建立一个10mm×100mm的铝板模型,应用汉宁窗调制的5周期200kHz正弦激励信号,研究了超声导波在铝板中的传播特性及其模式转换现象。文中涵盖了从模型构建、材料参数设置、网格划分、边界条件设定、激励信号施加到求解设置以及结果分析的完整流程。特别强调了汉宁窗调制的作用,即减少频谱泄漏并提高信号质量。 适合人群:从事超声检测、材料科学、物理学等相关领域的研究人员和技术人员,尤其是那些希望深入了解COMSOL仿真工具及其在超声导波研究中应用的人群。 使用场景及目标:适用于需要精确模拟超声波在固体介质中传播的研究项目,旨在验证理论预测、优化实验设计、评估不同材料和结构对超声波的影响。此外,还可以用于教学目的,帮助学生掌握COMSOL软件的操作方法和超声导波的基础知识。 其他说明:文中提供了详细的参数设置指导和代码片段,有助于读者快速复现仿真过程。同时,作者分享了一些实用技巧,如如何正确设置网格大小、选择合适的窗函数等,以确保仿真结果的准确性。

      离职人员分析仪表盘.xlsx

      离职人员分析仪表盘.xlsx

      基于LabVIEW的多功能虚拟函数信号发生器设计与信号分析

      内容概要:本文详细介绍了如何利用LabVIEW搭建一个多功能的虚拟函数信号发生器及其信号分析功能。首先,文章展示了如何通过LabVIEW的前面板和程序框图创建各种常见波形(如正弦波、方波、三角波等),并深入探讨了波形生成的具体实现方法,包括三角波的周期性和斜率计算、白噪声的生成以及自定义公式的解析。接着,文章讨论了信号处理的关键技术,如自相关分析、频谱分析、积分和微分运算,并提供了具体的实现代码和注意事项。此外,文中还分享了一些实用的经验和技术细节,如避免频谱泄漏的方法、处理多频波的技术、防止内存泄漏的措施等。 适用人群:从事信号处理、电子工程、自动化控制等领域的工作技术人员,尤其是那些熟悉或希望学习LabVIEW编程的人士。 使用场景及目标:适用于实验室环境或教学环境中,用于替代传统物理信号发生器进行信号生成和分析实验。主要目标是提高信号生成和分析的灵活性和便捷性,减少对昂贵硬件设备的依赖。 其他说明:本文不仅提供了详细的代码示例,还分享了许多作者在实践中积累的经验教训,帮助读者更好地理解和应用LabVIEW进行信号处理。

      线性代数_矩阵运算_方程组解释_MIT公开课笔记用途_1742822302.zip

      线性代数

      大雾至尊版V56泛滥无密码.zip

      大雾至尊版V56泛滥无密码.zip

      员工生日关怀方案.doc

      员工生日关怀方案

      试用期情况跟踪表.xls

      试用期情况跟踪表.xls

      员工激励机制与技巧.doc

      员工激励机制与技巧

      员工晋升的自我评价.doc

      员工晋升的自我评价.doc

      基于51单片机protues仿真的多功能婴儿车控制器(仿真图、源代码、AD原理图)

      基于51单片机protues仿真的多功能婴儿车控制器(仿真图、源代码、AD原理图) 该设计为51单片机protues仿真的多功能婴儿车控制器,实现温湿度,音乐,避障,声音监测控制; 1、温湿度检测,婴儿尿湿时会有提醒。 2、声音检测,当婴儿啼哭时也会有提醒。 3、小车避障,小车遇到障碍会后退左转。 4、音乐播放。 5、仿真图、源代码、AD原理图;

      【计算机求职笔试】编程语言基础、数据结构与算法、系统设计等核心考点解析及备考建议介绍了计算机求职笔试

      内容概要:本文档详细介绍了计算机求职笔试的内容与解答,涵盖编程语言基础、数据结构与算法、编程实践与调试、系统设计与软件工程以及综合题型与开放题五个方面。编程语言基础部分强调了语法规则、数据类型与运算符、面向对象编程的核心概念;数据结构与算法部分讲解了常见数据结构(如线性结构、树与图、哈希表)和高频算法(如排序算法、动态规划、递归与回溯);编程实践与调试部分关注编码能力和调试技巧;系统设计与软件工程部分探讨了设计模式、模块化设计、数据库与网络知识;综合题型与开放题部分则提供了场景题和逻辑思维题的示例。最后给出了备考建议,包括知识体系构建、刷题策略和模拟实战的方法。 适合人群:即将参加计算机相关职位笔试的求职者,特别是对编程语言、数据结构、算法设计有初步了解的应届毕业生或初级工程师。 使用场景及目标:①帮助求职者系统复习计算机基础知识,提升笔试通过率;②通过例题和解答加深对编程语言、数据结构、算法的理解;③提供模拟实战环境,提高时间管理和抗压能力。 阅读建议:建议按照文档提供的知识体系顺序进行系统复习,重点攻克高频题型,利用在线平台刷题练习,并结合实际项目经验进行综合应用,同时注意时间管理和抗压能力的训练。

      SecureCRT安装包

      SecureCRT安装包

      物流业人才流失与紧缺现象的对策研究.docx

      物流业人才流失与紧缺现象的对策研究

      招聘渠道费用仪表盘P10.pptx

      招聘渠道费用仪表盘P10.pptx

      五相永磁同步电机Simulink中PI双闭环SVPWM矢量控制建模与优化

      内容概要:本文详细介绍了五相永磁同步电机在Simulink环境下的PI双闭环SVPWM矢量控制建模过程及其优化方法。首先阐述了五相电机相比三相电机的优势,如更小的转矩脉动和更强的容错能力。接着探讨了复杂的Simulink模型搭建,涉及电机本体模块、坐标变换模块、SVPWM模块和PI调节器模块等多个组件。文中提供了具体的Clark变换和PI调节器的代码示例,解释了双闭环控制的工作原理,并详细描述了SVPWM与十扇区划分的具体实现方式。最后展示了模型的性能表现,包括良好的波形质量和快速的动态响应特性。 适合人群:从事电机控制领域的研究人员和技术人员,尤其是对五相永磁同步电机和Simulink建模感兴趣的读者。 使用场景及目标:适用于希望深入了解五相永磁同步电机控制原理并掌握具体实现方法的研究人员和技术人员。目标是帮助读者理解五相电机的特殊性和复杂性,掌握PI双闭环SVPWM矢量控制的建模技巧,提高电机控制系统的设计水平。 其他说明:文章不仅提供了理论知识,还包括了大量的代码片段和实践经验分享,有助于读者更好地理解和应用相关技术。

      员工离职交接表-模板.doc

      员工离职交接表-模板.doc

      离职率高"冰山"下的真相?你知道多少?.docx

      离职率高"冰山"下的真相?你知道多少?

      光伏MPPT中恒定电压法与PID控制结合的技术解析及其应用

      内容概要:本文详细介绍了光伏系统中最大功率点跟踪(MPPT)的一种常见方法——恒定电压法,并探讨了其与PID控制相结合的应用。恒定电压法通过将光伏板的输出电压固定在一个预设值附近,以期接近最大功率点。然而,由于光照和温度的变化,单纯依靠恒定电压法难以精确跟踪最大功率点。因此,引入PID控制器进行动态调整,能够显著提高系统的响应速度和稳定性。文中提供了具体的MATLAB和Python代码示例,展示了如何构建和优化这样的控制系统。同时,还讨论了在Simulink环境中建模时需要注意的关键技术和参数选择。 适合人群:从事光伏系统设计、开发以及维护的技术人员,尤其是希望深入了解MPPT算法原理并掌握具体实现方法的专业人士。 使用场景及目标:适用于需要快速实现MPPT功能的小型光伏系统,特别是在成本受限的情况下。通过学习本文,读者可以掌握恒定电压法的基本概念,学会利用PID控制提升性能的方法,从而更好地应对实际工程项目中的挑战。 其他说明:尽管恒定电压法加上PID控制可以在一定程度上改善MPPT的效果,但它并非最优解。对于更加复杂的环境条件,仍需采用更为先进的算法如电导增量法等。此外,文中提到的一些技巧和注意事项有助于避免常见的错误,确保仿真的准确性。

      基于蒙特卡洛算法的风光出力预测与场景削减技术在电力系统中的应用

      内容概要:本文详细介绍了利用蒙特卡洛算法进行风光出力预测的方法和技术。首先,通过威布尔分布和Beta分布分别模拟风速和光照强度的变化,生成大量的不确定场景。然后,为了减少计算复杂度并提高实用性,采用了K-means聚类算法对生成的大量场景进行削减,提炼出少数典型场景及其发生的概率。此外,还讨论了如何通过标准化处理解决不同量纲的问题以及如何引入时间相关性以增强模型的真实感。最后,提供了完整的代码实现和一些实用的调参建议。 适用人群:适用于从事电力系统规划、调度工作的专业技术人员,尤其是那些希望深入了解风光出力预测方法论的研究者和从业者。 使用场景及目标:本方法旨在帮助电网调度员更好地理解和应对由风速和光照引起的电力供应不确定性,从而制定更加科学合理的电力调度计划。具体应用场景包括但不限于短期负荷预测、电力市场交易决策支持等方面。 其他说明:文中不仅给出了详细的理论解释和技术实现步骤,还分享了许多实践经验,如选择合适的分布模型、调整参数以适应特定地区的气象条件等。同时强调了在实际应用过程中需要注意的一些潜在问题,例如确保数据的质量和准确性、考虑计算效率等因素。

    Global site tag (gtag.js) - Google Analytics