【问题标题】:Allow roles not working but allow users working in web.config允许角色不工作但允许用户在 web.config 中工作
【发布时间】:2013-03-23 07:07:10
【问题描述】:

我为表单身份验证实现了 asp.net 成员资格。通常用于登录,它使用 username,但我将其更改为使用 email id 登录。哪个工作正常。现在我正在尝试限制对不属于 Admin 角色的用户的访问。我在我这样写的那个文件夹中创建了 web.config 文件。

<?xml version="1.0"?>
<configuration>
  <system.web>
    <authorization>
      <allow roles="Admin" />
      <deny users="*"/>
    </authorization>
  </system.web>
</configuration>

当我用这个进行测试时,即使具有 admin 角色的用户无法访问。当他单击链接时,他正在退出(例如用户无权访问该页面)。为了显示菜单,我使用 web.sitemap 文件。它根据角色工作正常。 根据MSDN,该特定文件夹下的 web.cofnig 文件中的代码是正确的。我不知道为什么它不起作用。如果我们更改成员控制默认登录行为,那么任何事情都应该关注角色? 在 stackoverflow 以及其他一些站点中也发现了许多类似的问题。但没有什么能给我解决方案。这有什么问题?需要编写任何自定义代码来处理? 为了允许用户我写如下。它工作完美

<?xml version="1.0"?>
<configuration>
  <system.web>
    <authorization>
      <allow users="master@yahoo.com" />
      <deny users="*"/>
    </authorization>
  </system.web>
</configuration>

为什么它不仅仅适用于角色?

【问题讨论】:

    标签: asp.net .net web-config asp.net-membership forms-authentication


    【解决方案1】:

    RoleProvider 使用GetRolesForUser 方法检索用户的授权角色。

    // Notice that it accept username instead of email
    public string[] GetRolesForUser(string username)
    

    在您的情况下,您的 RoleProvidermaster@yahoo.com 作为用户名传递。结果,User表中没有master@yahoo.com的用户名。

    这里有解决方案 -

    1) 解决问题的最简单方法是将 Memberships 表的 Email 列复制到 UsersUserName 列强>表。

    2) 创建自定义RoleProvider 并覆盖GetRolesForUser 方法的艰难方法。

    3)如果你碰巧使用legacy Membership Provider而不是Universal Membership Provider,你可以修改aspnet_UsersInRoles_GetRolesForUser

    【讨论】:

      【解决方案2】:

      我使用了另一种方法。我没有用 emailid 更改登录名。我只使用电子邮件登录。但是问题来了,因为默认情况下,角色提供者使用 user name 而不是 email 进行验证。为此我改变了login 的行为。因此,当用户登录时,我曾经提供如下登录控制值。

       string username = Membership.GetUserNameByEmail(Login1.UserName);
       if (username != null)
       {
      
           isUser = Membership.ValidateUser(username, Login1.Password);
         }
        if (isUser)
        {
           Login1.UserName = username;
            e.Authenticated = true;
         }
      

      我正在登录页面中编写此代码。所以登录成功后,loginview 会相应更新。现在它工作完美。 Win给出的答案也不错。如果我们只想在 LoginView 中显示电子邮件 ID 而不是用户名,我们必须实现此方法。

      public string[] GetRolesForUser(string username)
      

      要通过电子邮件获取用户名,我们可以这样写

      string username = Membership.GetUserNameByEmail(Page.User.Identity.Name)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-19
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        相关资源
        最近更新 更多