3

我正在关注这篇文章,其中描述了如何在使用表单身份验证登录时为用户分配角色:

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角色提供者一样。

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

4

1 回答 1

2

您不需要roleManager在 web.config 中启用 - 毕竟,在角色管理器出现之前,人们曾经在 .NET 1.x 中使用角色。

为您做的一件roleManager您在代码中没有做的事情被设置Thread.CurrentPrincipalHttpContext.Current.User. 如果你依赖这个(例如使用PrincipalPermissionAttribute),那么你需要添加这个:

Thread.CurrentPrincipal = HttpContext.Current.User;

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

至于实现一个 dummy RoleProvider,这很容易:例如看到这个 MSDN 文章

你只需要实现GetRolesForUserandIsInRole方法;其他方法可以简单地抛出NotSupportedException

于 2012-09-24T13:09:34.153 回答