首页 文章

Identity 2.0自定义UserManager / RoleManager与razor调用User.IsInRole(“RoleName”)

提问于
浏览
3

问题如下:阅读以了解您需要帮助解答的问题......

我有

  • VS 2013

  • MVC 5与Razor视图

  • Dapper DAL自定义UserManager和UserStore /用户: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"));

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

问题:

  • User.IsInRole与UserManager / UserStore和/或RoleManager之间的关系是什么

  • 如何在Razor View中获取User.IsInRole(“Administrators”)以“理解”它需要使用我的自定义身份验证实现?

1 回答

  • 0

    我怀疑当用户登录时,您的实现不提供 ClaimsPrincipal .

    @User 应该是 ClaimsPrincipal 并且 IsInRolesee source)没有进入数据库,而是检查在主体's identity. If you see this exception, your IPrincipal is different form ' ClaimsPrincipal'上设置"Role"类型的声明 .

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

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

相关问题