启用没有(或使用虚拟)角色提供程序的角色

时间:2012-09-24 12:55:52

标签: asp.net .net authorization roleprovider asp.net-roles

我正在关注this article,其中介绍了在使用表单身份验证登录时如何为用户分配角色:

public void Application_AuthenticateRequest( Object src , EventArgs e )
{
   if (!(HttpContext.Current.User == null))
   {
      if (HttpContext.Current.User.Identity.AuthenticationType == "Forms" )
      {
      System.Web.Security.FormsIdentity id;
      id = (System.Web.Security.FormsIdentity)HttpContext.Current.User.Identity;
      String[] myRoles = new String[2];
      myRoles[0] = "Manager";
      myRoles[1] = "Admin";
      HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,myRoles);
      }
   }
}

我将角色逻辑放在事件处理程序中,所以我基本上不需要角色提供程序。尽管如此,为了运行此功能,似乎我必须在web.config中启用角色提供程序。可悲的是,如果我只是说:

<roleManager enabled="true"/>

它会导致与SQL服务器连接失败相关的运行时错误,就像我选择AspNetSqlRoleProvider作为角色提供程序一样。

如何让角色以这种方式工作?我怎样才能选择不使用角色提供者,或者我应该如何实现虚拟角色提供者(如果有意义的话)?

1 个答案:

答案 0 :(得分:2)

您不需要在web.config中启用roleManager - 毕竟,人们过去常常在使用.NET 1.x时使用角色。

roleManager将为您做的一件事,即您未在代码中执行的操作,将Thread.CurrentPrincipal设置为HttpContext.Current.User。如果你依赖于此(例如使用PrincipalPermissionAttribute),那么你需要添加:

Thread.CurrentPrincipal = HttpContext.Current.User;

否则,我希望它能起作用:你看到什么症状让你认为它不起作用?

至于实现虚拟RoleProvider,这很容易:例如,请参阅this MSDN article

您只需要实施GetRolesForUserIsInRole方法;其他方法可以简单地抛出NotSupportedException