允许角色不起作用但允许用户在web.config中工作

时间:2013-04-02 05:02:47

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

以下是解决方案 -

1)解决问题的最简单方法是将会员表的电子邮件列复制到用户的用户名 table。

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

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

答案 1 :(得分: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 给出的答案也很好。如果我们只想在LoginView而不是用户名中显示电子邮件ID,我们必须实现此方法。

public string[] GetRolesForUser(string username)

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

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