none
Page.User.IsInRole() 会员身分又是在哪定义的呢? RRS feed

  • 问题

  •    Page.User.IsInRole()  会员身分又是在哪定义的呢?比如我要写:
                if (Page.User.IsInRole("管理员"))
                {
                    Response.Write("你是管理员");
                }

    那“管理员”是在哪里定义的呢?
    我的意思是:是不是应该在:
                  FormsAuthentication.RedirectFromLoginPage(UserEmail.Text, true);  
    的同时把会员的身分加入(定义)呢?     
    www.haodd123.com 我是半路出家,而且是自学 学的是C#语言,希望回帖的高手们留意一下,谢谢大家的帮助
    2009年2月12日 17:08

答案

  • cankao

    http://zhangchenliang.blogbus.com/logs/1480080.html

    下面给你一个详细的例子:
    1.web.config里加

    <authentication mode="Forms">
      <forms
      name=".ASPXAUTH"
      loginUrl="Login.aspx"
      defaultUrl="default.aspx"
      protection="All"
      timeout="30"
      path="/">
      </forms>
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>

    2,Login.aspx

    <%@ Page Language="C#" AutoEventWireup="true"%>
    <script runat="server">

      protected void Button1_Click(object sender, EventArgs e)
      {
        String username = UserName.Text;

          if (username.EndsWith("mxh", StringComparison.InvariantCultureIgnoreCase) && Password.Text.EndsWith("mxh", StringComparison.InvariantCultureIgnoreCase))
          {
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
            username,
            DateTime.Now,
            DateTime.Now.AddMinutes(30),
            false,
            "admin|reader|editor",
            FormsAuthentication.FormsCookiePath);
            string encTicket = FormsAuthentication.Encrypt(ticket);
            Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
            Response.Redirect(FormsAuthentication.GetRedirectUrl(username, false));
          }
          else
          {
            Response.Write("密码不正确");
          }
      }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      用户名:<asp:TextBox ID="UserName" runat="server" />mxh <br />
      密码:<asp:TextBox ID="Password" TextMode="password" runat="server" />mxh<br />
      <asp:Button ID="Button1" Text="登录" runat="server" onclick="Button1_Click" />
      </form>
    </body>
    </html>



    3,Global.asax

    <%@ Application Language="C#" %>
    <script runat="server">
        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
          string cookieName = FormsAuthentication.FormsCookieName;

          HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
          //HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
          if (null == authCookie)
          {
            // 没有身份验证 cookie。
            return;
          }
          FormsAuthenticationTicket authTicket = null;
          authTicket = FormsAuthentication.Decrypt(authCookie.Value);

          if (null == authTicket)
          {
            // 无法解密 Cookie。
            return;
          }

          string[] roles = authTicket.UserData.Split(new char[] { '|' });
          FormsIdentity id = new FormsIdentity(authTicket);
          System.Security.Principal.GenericPrincipal principal = new System.Security.Principal.GenericPrincipal(id, roles);
          Context.User = principal;
        }

    </script>



    4,使用

     protected void Page_Load(object sender, EventArgs e)
     {
       Response.Write(Page.User.IsInRole("reader"));
    }


    用户验证和角色分配完全可以从数据库读取。

    孟宪会
    • 已标记为答案 lkf18 2009年2月13日 18:59
    • 取消答案标记 lkf18 2009年2月13日 19:00
    • 已标记为答案 lkf18 2009年2月13日 19:00
    2009年2月13日 12:35
    版主

全部回复

  • 如果用Forms Authentication,那么是在创建FormsAuthenticationTicket的时候定义的。
    如果用Windows Authentication,那么是服务器管理员指定的。

    MSMVP VC++
    2009年2月12日 23:11
    版主
  • 你要是使用的 membership  那么你可以在网站  asp.net 管理设置 里面设置


    Guitar Hero IV -- Singing Rock & Roll.
    2009年2月13日 1:48
  • 看你使用何種驗證法:

    1. 一般性的表單驗證:使用者的角色由 GenericIdentity 來定義。
    2. Windows 驗證:使用者的角色由 WindowsIdentity 來定義。
    3. Membership 驗證:由 Membership 服務中的 Role 來定義。

    不過不論是哪一種驗證法,都可以用 URL 授權方式來設定可瀏覽的角色。
    MVP 2009 (ASP.NET), MCPD: ASP.NET Developer 3.5, MCPD: Windows Developer 3.5, MCITP: Database Developer 2008, MCITP: Enterprise Administrator 不想被人認為是小白,就不要總是在做一堆會讓人認為是小白的事。
    2009年2月13日 4:26
  •   哎 我水平太低,对各位的高论,犹如鸭子听雷,无从理解,不过我 Sheng Jiang老师的话自己写了点代码,还有点疑问帖上来,请老师们给我看看,谢谢。

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            if (txtUserName.Text == "lkf" && txtUserPwd.Text == "123")
            {
                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,//票证的版本号
                    txtUserName.Text,//与身分验证票关联的用户名
                    DateTime.Now,
                    DateTime.Now.AddMinutes(30),
                    chkRememberMe.Checked,//票证可以跨浏览器使用为true,否则为false
                    "管理员",//存储在票证中的用户特定数据
                    FormsAuthentication.FormsCookiePath);
                    string encryptedTicket = FormsAuthentication.Encrypt(ticket);

                HttpCookie authCookie = new HttpCookie(
                                            FormsAuthentication.FormsCookieName,
                                            encryptedTicket);
                authCookie.Secure = true;

                Response.Cookies.Add(authCookie);
                if (Request.QueryString["ReturnUrl"] != null)
                {
                    Response.Redirect(Request.QueryString["ReturnUrl"]);
                }
                FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, chkRememberMe.Checked);//添加票证到cookie并重定向到最初请求的页面
               
            }
        }
     如果像我那样写对么?
         Response.Cookies.Add(authCookie);
    和   FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, chkRememberMe.Checked);
    功能好像是重复的吧?
    且,我不用FormsAuthentication.RedirectFromLoginPage,好像是判定为没有登录!!!!!!




    www.haodd123.com 我是半路出家,而且是自学 学的是C#语言,希望回帖的高手们留意一下,谢谢大家的帮助
    2009年2月13日 11:02
  • cankao

    http://zhangchenliang.blogbus.com/logs/1480080.html

    下面给你一个详细的例子:
    1.web.config里加

    <authentication mode="Forms">
      <forms
      name=".ASPXAUTH"
      loginUrl="Login.aspx"
      defaultUrl="default.aspx"
      protection="All"
      timeout="30"
      path="/">
      </forms>
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>

    2,Login.aspx

    <%@ Page Language="C#" AutoEventWireup="true"%>
    <script runat="server">

      protected void Button1_Click(object sender, EventArgs e)
      {
        String username = UserName.Text;

          if (username.EndsWith("mxh", StringComparison.InvariantCultureIgnoreCase) && Password.Text.EndsWith("mxh", StringComparison.InvariantCultureIgnoreCase))
          {
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
            username,
            DateTime.Now,
            DateTime.Now.AddMinutes(30),
            false,
            "admin|reader|editor",
            FormsAuthentication.FormsCookiePath);
            string encTicket = FormsAuthentication.Encrypt(ticket);
            Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
            Response.Redirect(FormsAuthentication.GetRedirectUrl(username, false));
          }
          else
          {
            Response.Write("密码不正确");
          }
      }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      用户名:<asp:TextBox ID="UserName" runat="server" />mxh <br />
      密码:<asp:TextBox ID="Password" TextMode="password" runat="server" />mxh<br />
      <asp:Button ID="Button1" Text="登录" runat="server" onclick="Button1_Click" />
      </form>
    </body>
    </html>



    3,Global.asax

    <%@ Application Language="C#" %>
    <script runat="server">
        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
          string cookieName = FormsAuthentication.FormsCookieName;

          HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
          //HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
          if (null == authCookie)
          {
            // 没有身份验证 cookie。
            return;
          }
          FormsAuthenticationTicket authTicket = null;
          authTicket = FormsAuthentication.Decrypt(authCookie.Value);

          if (null == authTicket)
          {
            // 无法解密 Cookie。
            return;
          }

          string[] roles = authTicket.UserData.Split(new char[] { '|' });
          FormsIdentity id = new FormsIdentity(authTicket);
          System.Security.Principal.GenericPrincipal principal = new System.Security.Principal.GenericPrincipal(id, roles);
          Context.User = principal;
        }

    </script>



    4,使用

     protected void Page_Load(object sender, EventArgs e)
     {
       Response.Write(Page.User.IsInRole("reader"));
    }


    用户验证和角色分配完全可以从数据库读取。

    孟宪会
    • 已标记为答案 lkf18 2009年2月13日 18:59
    • 取消答案标记 lkf18 2009年2月13日 19:00
    • 已标记为答案 lkf18 2009年2月13日 19:00
    2009年2月13日 12:35
    版主
  •                          非常感谢 孟老师的精彩回答!    O(∩_∩)O谢谢

    枉自揣测 一下您是搞教学工作的么?讲的东西觉得非常通俗易懂!!

    www.haodd123.com 我是半路出家,而且是自学 学的是C#语言,希望回帖的高手们留意一下,谢谢大家的帮助
    2009年2月13日 19:07
  • 标记下!呵呵
    郭鹏
    2009年2月14日 15:15
  •      public GenericPrincipal(IIdentity identity, string[] roles)

    2015年3月19日 8:03
  • good!
    2015年3月19日 8:04