zoukankan      html  css  js  c++  java
  • ASP.NET2.0角色控制和管理

    安全性必要性
    对于网站而言,用户身份认证与权限管理是非常重要的部分。
    通过用户和密码,对用户进行身份验证,并指派他可访问的资源,这部分工作一直都是网站开发的重要内容。
    在另外一些情况下,需要根据用户的身份进行权限识别,不同用户访问相同页面,也需要显示不同的内容。
    这涉及到用户权限管理部人,也是风站开发的核心内容。
    角色控制概述
    memberhip和role memager能够非常好的解决这个问题,不但可以对用户的登陆信息进行统一管理,还可以就用户的权限进行分类管理,让开发者方便的就网站权限与安全必进行设定。
    Login控件更提从了一种非常方便的建造登陆与用户管理信息的法
    认证与授权
    asp.net通过与iis协同工作来进行授权管理。共两种身份认证方式。
    通过查询acls列表或者许中证来判定该访问是否拥有浏览的以权利。
    通过url认证
    认证方式
    当用户以访问某网站的时侯。两种授权方式分别会进行不同的动作。
    第一种认证方式会根据用户的登陆信息来判定asp.net针对该用户所指定的系统帐号,然后再判断系统帐号是否对被请求的本地资源有访问权限。
    第二种身份认证方式通过检查asp.net配置文件来进行授权认证。
    Asp.net的页面认证方式中,可以使用以下三种方式进行身份认证。
    通过修改config文件中的authentication属性,可以配置不同的认证方式。
    取值
    描述
    None
    不进行授以与身份验证
    Windows
    基于windows身份验证,首先判断window用户的身份和组
    Forms
    基于cookie的身份认证机制
    Passport
    使用PassPort SDK进行二次开发
    <configuration>
           <system.web>
                  <authentication mode=”Forms”/>
           </system.web>
    </configuration>
    window认证方式
    window认证方式通过使用windowsprincipal类对用户的windows身份进行判定,然后根据用户所属的window身份组来进行认证。
    需用在web.config里加上<authentication mode=”Windows”/>
    Demo1(Lesson6/windowsAuthentication.apx//web.config)
    Page_Load(Object sender, EventArgs e){
            AuthUser.Text = User.Identity.Name;   //用户的名称
            AuthType.Text = User.Identity.AuthenticationType; //用户的认证类型(NTLW)
    }
    Form认证方式
    Forms认证方式是在窗体内提供用户输入id和密码的地方,并根据用户输入的id和密码进行身份认证。
    Forms认证方式同时还使用cookie记录用户的信息当用户访问其他页面的时侯,程序通过访问cookie来获得用户的身份信息。
    Forms认证方式配置文件
    <authentication mode="Forms">
           <forms name=".ASPXUSERDEMO" loginUrl="Formslogin.aspx" protection="All" timeout="60" />
    </authentication>
    Forms认证配置文件讲解
    配置文件中的属性意义如下表所示
    属性
    描述
    LoginUrl
    指定一个用于登陆的页面
    Name
    Cookie的名字,注意,如果一个服务器有很多应用的话,要给cookie其不同的名字。
    TimeOut
    Cookie的存活时间默认值是30分钟
    Protection
    Cookie被保存的方式
    Path
    Cookie的保存路径
    Protection属性
    Protection是用来描述cookie的保存方式的,有下列四个可选择项目
    属性
    描述
    None
    不使用任何方法保护cookie
    Encryption
    使用des或者三层des对cookie进行加密,但是并不对cookie传输中是否被监听或篡改进行监视。
    Validation
    监视cookie,保证传输过程中不会被监听或者篡改。但是并不对cookie进行加密。
    All
    同时使用Encryption和Validation
    Demo2(lesson6/)
    Web.config
    <authentication mode="Forms">
           <forms name=".ASPXUSERDEMO" loginUrl="Formslogin.aspx" protection="All" timeout="60" />
    </authentication>
    FormsLogin.apx
    单击的登陆事件的内容如下:
    If (UserEmail.Value = = "someone@www.frontfree.com" And UserPass.Value = = "password")
    {FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked);}
    else;//将页面转到调用登陆窗口的页,同时传送用户的基本信息
     { Msg.Text = "用户名密码错误,请重新尝试"}
    Default.apx
    主页加载事件的内容
    Welcome.Text = "Hello, " + User.Identity.Name;//显示注册用户的信息
    注销用户事件的内容
    FormsAuthentication.SignOut();//注销用户信息
    Response.Redirect("Formslogin.aspx")
    使用文件记录用户的帐号和密码
    用户还可以通过指定可访问的用户名和密码来指定访问用户。
    <authentication>
           <credentials passwordFormat=”SHA1”>
                  <user name=”Mary” password=”adadfsdfdfdsf”/>
                  <user name=”John” password=”adfsdfdfdsf”/>
           </credentials>
    </authentication>
    在指定密码的保存方式时,可以指定密码的存方式,有三种方式。
    Hash类型
    描述
    Clear
    不加密进行存储
    SHA1
    使用SHA1进行加密
    MD5
    使用MD5进行加密
    授权用户与角色
    用户访问还可以通过定制访问规则来实现对用户的角色分配。
    <authorization>
           <allow users=”supper3000@gmail.com”/>
           <allow roles=”Admin”/>
           <deny user=”*”/>
    </authorization>
    verb=”post,get”
    *(所有用户)?(匿名用户)
    使用用户管理控件
    Login //登录控件
    LoginStatus //用来表明当前的登录状态
    CreateUserWizard //创建新用户模板
    LoginView //根据用户是否登录来选择显示内容
    ChangePassword //用来更改用户的密码
    Demo3
    Web.config
    <authentication mode=”Forms”/>
    Site.master
    <asp:loginstatus ID="loginstatus" runat="server"/> //用来表明当前的登录状态
    把它的view初始值设置为Login
    login.aspx
    <asp:Login ID="Login1" runat="server" BackColor="#F7F7DE" BorderColor="#CCCC99" BorderStyle="Solid" BorderWidth="1px" CreateUserText="创建用户" CreateUserUrl="~/CreateUser.aspx" Font-Names="Verdana"
            Font-Size="10pt">
            <TitleTextStyle BackColor="#6B696B" Font-Bold="True" ForeColor="#FFFFFF" />
    </asp:Login>
    添加上上面的两项,可以在登录页面上看到有新建用户的链接。
    Default.aspx
    <asp:loginview ID="LoginView1" runat="server">
        <loggedintemplate>
          <h1>
            <asp:loginname id="LoginName1" runat="server" formatstring="Welcome {0}" />
          </h1>
        </loggedintemplate>
        <anonymoustemplate>
          <h1>Welcome to Login Controls</h1>
          <asp:login ID="Login1" runat="server" createuserurl="CreateUser.aspx" createusertext="Create a New Account" />
        </anonymoustemplate>
       
     </asp:LoginView>
    CreateUser.apx
    <asp:CreateUserWizard ID="CreateUserWizard1" runat="server" ContinueDestinationPageUrl="~/Default.aspx">
    <WizardSteps>
               <asp:CreateUserWizardStep runat="server">
               </asp:CreateUserWizardStep>
               <asp:CompleteWizardStep runat="server">
               </asp:CompleteWizardStep>
    </WizardSteps>
    </asp:CreateUserWizard>
    <asp:CompleteWizardStep runat="server"></asp:CompleteWizardStep>
    </WizardSteps>
    </asp:CreateUserWizard>
    其实直接拖动一个这样的控件就可以产生上面的内容。
    在新建用户时应注意,用户在可以随便定,但密码为了字全,微软规定要有最少七位,另外还得有个特殊字符。
    成员管理
    成员管理特性是基于membership和memberhipuser两个类。可以使用memship类为asp.net创建用户。
    Memberhip类还可以完成以下工作:
    建立一个新的membershipuser
    可以对用户身份进行验证
    找回一个membershipuer实例
    更新一个membershipuser实例
    通过不同的条件寻找一个用户
    获得当前在线用户数量
    删除一已经不再需用的帐户
    membershipuser类中以完成以下工作:
    访问一个membershipuser示例的属性
    找回一个用户的密码
    修改一个用户的密码
    修改一个用户的密码问题以及密码问题的答案
    为一个已经因为多次尝试密码挫败而锁定的用户解除锁定
    角色管理
    角色管理在于role类实现
    通过角色管理类,可以实现以下工作:
    新建一个角色;删除一种角色;给一个用户分配角色;去除一个用户的角色;判断用户是否被授权给一个特殊的角色;在一种角色中寻找一个用户,从一个用户信息中获得他所具有的角色信息。
    创建用户
    通过调用membership的createuser方法,可以创建用户,需要注意的是membership的密码要求长于7位,并需用有至少一个特殊字符。
    Demo4(membership)
    Web.config
    <system.web>
    <roleManager enabled="true" />
    </system.web>
    <location path="secured">
           <system.web>
                  <authorization>
                         <deny users="?"/>
                         <allow users="*"/>
                  </authorization>
           </system.web>
    </location>
    <location path="administrators_role">
           <system.web>
                  <authorization>
                         <allow roles="Administrators" />
                         <deny users="*"/>
                  </authorization>
           </system.web>
    </location>
    CreatingUsers.aspx
    <一>添加新用户的单击事件
    string userName = txtUserId.Text;
    string password= txtPassword.Text;
    string email = txtEmail.Text;
    string passwordQuestion= ddlPasswordQuestion.SelectedValue;
    string passwordAnswer = txtPasswordAnswer.Text;
    MembershipCreateStatus result
    Membership.CreateUser(userName, password, email, passwordQuestion, passwordAnswer, True, result);
    lblResults.Visible = True;
    switch result
    {
    Case MembershipCreateStatus.Success
            txtUserId.Text = “”;
            txtPassword.Text =””;
            txtEmail.Text = “”;
            ddlPasswordQuestion.SelectedIndex = -1;
            txtPasswordAnswer.Text = “”;
            lblResults.Text = "User successfully created!";
            break;
          Case MembershipCreateStatus.InvalidUserName
            lblResults.Text = "这个用户名是无效的,请重新输入一个新的名称。";
            break;
          Case MembershipCreateStatus.InvalidPassword
            lblResults.Text = "密码不正确,请重新输入";
            break;
          Case MembershipCreateStatus.InvalidEmail
            lblResults.Text = "电子邮件格式不正确,请重新输入";
            break;
          Case MembershipCreateStatus.InvalidQuestion
            lblResults.Text = "问题的格试不正确,请重新输入";
                  break;
          Case MembershipCreateStatus.InvalidAnswer
            lblResults.Text = "密码回答不正确,请重新输入";
                  break;
          Case MembershipCreateStatus.DuplicateUsername
            lblResults.Text = "用户已经被使用,请重新输入";
                  break;
          Case MembershipCreateStatus.DuplicateEmail
            lblResults.Text = "电子邮件已经在使用,请输入一个不同是的电子邮件地址”;
                  break;
     Case Else
            lblResults.Text = "An error occurred while creating the user."
    }
    true是否用户一开通就被授权。
    Login.apx
    <二>登录事件
    string userName = txtUserId.Text;
    string password = txtPassword.Text;
    if (Membership.ValidateUser(userName, password))
    {
          If  ! (Request.QueryString("ReturnUrl") Is nothing) //如果该项有值则切换到转向此页的页面
          {
            FormsAuthentication.RedirectFromLoginPage(userName, False);转到调用这个页的页
          }
          else
          {
           FormsAuthentication.SetAuthCookie(userName, False);不转到其它页
            Response.Redirect("~/secured/menu.aspx");转向其它的页面
          }
    else
     {
          lblResults.Visible = True;
           lblResults.Text = "Unsuccessful login. Please re-enter your information and try again.";
     
          If (Not Membership.GetUser(userName) Is Nothing)如果验证不正确,且又存在该用户
              If(Membership.GetUser(userName).IsLockedOut = true)用户是否已锁定(5次)
                   lblResults.Text = lblResults.Text & " <b>Your account has been locked out.</b>"
              End If
          End If
        End If
    <三>用户的注销
    FormsAuthentication.SignOut();//注销用户
    Roles.DeleteCookie();//清除cookie
    FormsAuthentication.RedirectToLoginPage();//注销后转回到登陆页
    用户信息的显示
    MemberShipUser memUser=MemberShip.GegUser();
    <%=Server.HtmleEncode(memUser.UserName)%>//用户名
    <%=Server.HtmleEncode(memUser.Email)%>//用户的电子邮件
    <%=Server.HtmleEncode(memUser.IsApproved)%>//是否批准和通过
    <%=Server.HtmleEncode(memUser.PasswordQuestion)%>//用户的密码问题
    <%=Server.HtmleEncode(memUser.IsOnline)%>// 用户是否在线
    <%=Server.HtmleEncode(memUser.LastLoginDate.ToString(“F”))%>//最后登录时间
    <%=Server.HtmleEncode(memUser.LastActivityDate.ToString(“F”))%>//最后活动时间
    <%=Server.HtmleEncode(memUser.LastPasswordChangeDate.ToString(“F”)%>//最后一次更密码时间
    <四>删除当前登录的用户信息
    if(MemberShip.Deleteuser(User.Identity.Name))
    {
           FormAuthentication.SignOut();
           Roles.DeleteCookie();
           Response.Redirect(“~/CreatingUsers.aspx”);
    }
    else
    {
    lblReult.Visible=True;
    lblReult.Text=”这个用户不能被删除”;
    }
    <五>更新用户信息
    (1)       数据源的定义
    <asp:ObjectDataSource ID=”ObjectDataSource1” runat=”server”
    DataObjectTypeName=”System.Web.Security.MemberhipUser”
    SelectMethod=”GetUser”
    TypeName=”System.Web.Security.Membership”/>
    (2)       显示用户数据的控件
    <asp:DetialsView AutoGenerateRows=”False” DataSourceID=”ObjectDataSource1”
           ID=”DetalisView1” runat=”server” AutoGeneratiEditButton=”true”
           OnItemUpdating=”DatailsView_ItemUpdating”>
           <Fields>
           <asp:BindField DataField=”CretionDate” HeaderText=”CreationDate”
            ReadOnly=”true” SortExpression=”CreationDate”/>
           <asp:BindField DataField=”Comment” HeaderText=”Comment”
            ReadOnly=”true” SortExpression=”Comment”/>
           <asp:BindField DataField=”ProviderName” HeaderText=”ProviderName”
            ReadOnly=”true” SortExpression=”ProviderName”/>
           …………..
           </Field>
    </asp:DetialsView>
    private void DetailsView1-ItemUpdating(Object Sender,DetailsViewUpdateEventArgs e)
    {
           MembershipUser memUser=Memberhip.GetUser();
           MemUser.Email=e.NewValues(0).ToString();
           MemUser.Comment=e.NewValues(1).ToString();
           Memberhip.UpdateUser(memUser);
           e.Cancel=true;
           DetailsView1.ChangeMode(DetailsViewMode.ReadOnly);
    }
    <六>用户的解锁
    MembershipUser memUser=Membership.GetUser(txtUserName.text);
    If(!memUser is Nothing &&memUer.IsLockedOut= =true)
    {
           memUer.UnlockUser();
    }
    DetailsView1.DataBind();
    Private void Page_Load(Object sender,System.EventArg e)
    {
           if (!Page.IspostBack)
    {
           txtUserName.Text=User.Identity.Name;
    }
    }
     
    <七>角色的添加
    Roles.CreateRole(txtCreateRole.Text);
    <八>角色的删除
    Roles.DeleteRole(listboxRoles.SelectedValue);
    <九>在列表中添加所有的角色
    ListboxRoles.DataSource=Roles.GetAllRoles();
    <十>查看角色是否存在
    Roles.RoleExists(“Administrators”);
    因为爱上你,我才懂得珍惜,每一天日记,都写满了甜蜜
    因为想念你,我每天都可以,对着镜子说我多爱你,有多想见到你。
  • 相关阅读:
    nodejs + mongodb
    实习踩坑
    jQuery获取点击对象的父级
    python正则表达式
    python文件基础IO,OS
    python模块
    python时间和日期
    python number
    python循环
    Vue2.0 【第一季】第6节 v-model指令
  • 原文地址:https://www.cnblogs.com/jackzhang/p/570224.html
Copyright © 2011-2022 走看看