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”);
    因为爱上你,我才懂得珍惜,每一天日记,都写满了甜蜜
    因为想念你,我每天都可以,对着镜子说我多爱你,有多想见到你。
  • 相关阅读:
    数据绑定表达式语法(Eval,Bind区别)
    使用博客园的第一件事 自定义主题
    sql2000 跨服务器复制表数据
    使用UpdatePanel 局部刷新出现中文乱码的解决方法!!
    MMC不能打开文件MSC文件
    sql 日期 、时间相关
    loaded AS2 swf call function in AS3 holder
    Rewrite the master page form action attribute in asp.net 2.0
    100万个不重复的8位的随机数
    flash 中实现斜切变型
  • 原文地址:https://www.cnblogs.com/jackzhang/p/570224.html
Copyright © 2011-2022 走看看