Identity 2.0自定义UserManager / RoleManager vs razor调用User.IsInRole(" RoleName")

时间:2014-09-26 18:53:51

标签: asp.net-identity iprincipal isinrole

问题如下:请仔细阅读以了解您需要帮助解答的内容......

我有

  • VS 2013
  • 使用Razor视图的MVC 5
  • Dapper DAL Custom UserManager和UserStore / User:IUser< int>

我构建了自己的UserManager,RoleManager,UserStore,RoleStore,以及基于CustomUser的所有内容:IUser< int>和CustomRole:IRole< int>

我可以更改密码,恢复忘记的密码,登录,退出......一切正常。

但是,在剃刀视图中,当我尝试使用时:

User.IsInRole("Administrators");

我从其他模块中得到一个SQL异常(可能发生在iPrincipal Identity类中):

System.Data.SqlClient.SqlException occurred
  _HResult=-2146232060
  _message=A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)
  Source=.Net SqlClient Data Provider
  ErrorCode=-2146232060
  _doNotReconnect=false
  Class=20
  LineNumber=0
  Number=-1
  Server=""
  State=0
  StackTrace:
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
  InnerException: <null>

但我可以致电

var user = AsyncHelpers.RunSync<CloudUser>(() => UserManager.FindByNameAsync(User.Identity.Name));
ViewBag.IsInAdminRole = AsyncHelpers.RunSync<bool>(() => UserManager.IsInRoleAsync(user.Id, "Administrators"));

在我的控制器服务器代码....

问题:

  1. User.IsInRole与UserManager / UserStore和/或RoleManager之间的关系

  2. 如何让Razor View中的User.IsInRole(“管理员”)“理解”它需要使用我的自定义身份验证实现?

1 个答案:

答案 0 :(得分:0)

我怀疑您的实施在用户登录时未提供ClaimsPrincipal

@User应为ClaimsPrincipalIsInRolesee source)不会进入数据库,而是检查在委托人身份上设置的“角色”类型的声明。如果您看到此异常,则您的IPrincipal与'ClaimsPrincipal'不同。

我已经阅读了您链接的答案,我认为这不是与Identity框架一起使用的最佳解决方案。 The answer是pre-Identity并谈论MembershipProvider。在处理MembershipProvider时,您必须执行这些操作。现在,Identity为您提供了更好,更清晰的自定义功能。

我建议不要实施CustomPrincipal并使用.Net框架提供的ClaimsPrincipal。当您从ClaimTypes.Role返回IPrincipal时,只需在主体上添加带有角色名称的UserManager.CreateIdentityAsync类型的声明。