ASP.NET角色提供者与成员提供者

时间:2009-09-03 10:00:37

标签: asp.net roleprovider

请参阅this帖子。

我已经能够配置我的web.config文件,以便当未经身份验证的用户请求页面时,他会被重定向到Login.aspx页面。

我已经能够通过配置web.config文件和以下几行代码来实现这一点:

protected void btnLogin_Click(object sender, EventArgs e)
        {
            string username = this.usernameTextBox.Text;
            string password = this.passwordTextBox.Text;

            bool success = Membership.ValidateUser(username.Trim(), password.Trim());

            if (success)
            {
                FormsAuthentication.SetAuthCookie(username, true);

                Ice_Web_Portal.BO.User user = Ice_Web_Portal.BO.User.GetUserByUserName(username);

                Ice_Web_Portal.BO.UserTypeEnum loginUserType = user.UserTypeEnum;

                if (loginUserType == UserTypeEnum.Student)
                {
                    Response.Redirect("~/Student/StudentControlPanel.aspx?username=" + username);
                }
                else if (loginUserType == UserTypeEnum.Teacher)
                {
                    Response.Redirect("~/Teacher/TeacherControlPanel.aspx?username=" + username);
                }
                else if(loginUserType == UserTypeEnum.Webmaster)
                {
                    Response.Redirect(@"~/Webmaster/WebmasterControlPanel.aspx");
                }
                else
                {
                    labLoginMessage.Text = "Sorry! Type of user couldn't be determined!";
                }
            }
            else
            {
                labLoginMessage.Text = Ice_Web_Portal.BO.User.LoginMessage;
            }
        }

但我遇到的问题是,一旦用户通过身份验证,他就可以访问整个Web应用程序中的所有页面。

但我需要根据他们的角色限制他们的页面访问区域。即当具有不同角色的用户请求页面时,他应该被自动重定向到Login.aspx页面。

可能有一种技术可以检查Page_Load()-event中的特定用户角色,然后将用户重定向到Login.aspx页面,如果他不在该角色中。但我不想那样做。我想自动发生。我只需要使用角色提供程序框架和web.config文件(因为在成员资格的情况下。即我不需要检查Page_Load事件的成员资格.Web.config文件自动阻止访问)。

有人能告诉我如何在此中加入角色功能,以便将特定用户限制在其特定的角色区域内?

生成授权凭单的代码是什么?

3 个答案:

答案 0 :(得分:4)

将部分添加到web.config

  <location path="page-only-allowed-to-be-accessed-by-admin.aspx">
      <system.web>
         <authorization>
           <allow roles="admin"/>
           <deny users="*" />
         </authorization>
      </system.web>
   </location>

您可能会发现这篇文章很有趣 - web.config demystified

修改

生成授权凭证的代码在您的代码中。

FormsAuthentication.SetAuthCookie(username, true);

这样实现(使用Red Gate's Reflector

public static void SetAuthCookie(string userName, bool createPersistentCookie, string strCookiePath)
{
    Initialize();
    HttpContext current = HttpContext.Current;
    if (!current.Request.IsSecureConnection && RequireSSL)
    {
        throw new HttpException(SR.GetString("Connection_not_secure_creating_secure_cookie"));
    }
    bool flag = CookielessHelperClass.UseCookieless(current, false, CookieMode);
    HttpCookie cookie = GetAuthCookie(userName, createPersistentCookie, flag ? "/" : strCookiePath, !flag);
    if (!flag)
    {
        HttpContext.Current.Response.Cookies.Add(cookie);
        current.CookielessHelper.SetCookieValue('F', null);
    }
    else
    {
        current.CookielessHelper.SetCookieValue('F', cookie.Value);
    }
}

RoleProvider将获取给定用户的角色,因此当检查web.config是否为应用程序的给定部分允许或拒绝角色/用户时,RoleProvider将获取用户的角色,然后检查允许/拒绝角色并在适当时进行授权。

答案 1 :(得分:2)

使用角色提供程序。

设置角色提供程序并为用户分配角色后,可以使用Web.config的<authorization>部分根据角色成员资格限制对各种资源的访问。

如果您有可用的SQL Server,我建议您使用SqlRoleProvider。它非常灵活,它可以为用户名分配角色,而无需先注册用户 - 具体而言,您不需要也使用SqlMembershipProvider(或实际上任何成员资格提供者)。 IE浏览器。如果您将角色“Student”添加到用户名“John”,SqlRoleProvider将简单地将该角色与该用户名相关联,并且一切正常。

祝你好运!

答案 2 :(得分:0)

如果您在文件夹中有一组受限文件,则可以在web.config中重新设置该文件夹的角色:

例如:

<location path="TeacherAdmin" allowOverride="false">        
  <system.web>
    <authorization>
      <allow roles="Teacher"/>
      <deny users="*,?"/>           
    </authorization>        
  </system.web>     
</location>

注意:path属性也可以指向特定的aspx页面