3

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

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

当我用这个进行测试时,即使具有管理员角色的用户无法访问。当他单击链接时,他正在退出(例如用户无权访问该页面)。为了显示菜单,我正在使用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>

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

4

2 回答 2

3

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

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

在您的情况下,您的RoleProvider通行证master@yahoo.com作为用户名。结果,master@yahoo.com用户表中没有用户名。

以下是解决方案 -

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

RoleProvider2)创建自定义和覆盖方法的艰难GetRolesForUser方法。

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

于 2013-04-02T17:46:37.517 回答
0

我使用了另一种方法。我没有用 emailid 更改登录名。我只使用电子邮件登录。但是问题来了,因为默认情况下,角色提供者使用用户名而不是电子邮件进行验证。为此,我改变了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给出的答案也不错。如果我们只想显示电子邮件 IDLoginView而不是用户名,我们必须实现此方法。

public string[] GetRolesForUser(string username)

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

string username = Membership.GetUserNameByEmail(Page.User.Identity.Name)
于 2013-04-03T05:19:22.740 回答