2013-09-30 163 views
5

在ASP MVC5 RC我没有得到角色系统的工作。 我的数据库有所有需要表的角色存在,但证明如果用户在角色中总是返回false(无SQL异常或其他)!角色管理在ASP MVC 5(Microsoft.AspNet.Identity)

我需要在某处激活IPrincipal的角色系统吗?

测试代码:

AccountController accCont = new AccountController(); 

// check role exist : result = true 
var roleExist = await accCont.IdentityManager.Roles.RoleExistsAsync("61c84919-72e2-4114-9520-83a3e5f09de1"); 

// try find role by name : result = role object 
var role = await accCont.IdentityManager.Roles.FindRoleByNameAsync("ProjectAdministrator"); 

// check with AccountController instance : result = true 
var exist = await accCont.IdentityManager.Roles.IsUserInRoleAsync(User.Identity.GetUserId(), role.Id); 

// check if current user is in role : result (both) = false???? 
var inRole = User.IsInRole(role.Id); 
var inRole2 = User.IsInRole(role.Name); 

我也尝试从Microsoft.AspNet.Identity.Owin命名空间打造像IIdentity.GetUserId()扩展方法的定制过错。

namespace Microsoft.AspNet.Identity 
{ 
    public static class IdentityExtensions 
    { 
     public static string IsUserInRole(this IIdentity identity) 
     { 
      if (identity == null) 
      { 
       throw new ArgumentNullException("identity"); 
      } 
      ClaimsIdentity identity2 = identity as ClaimsIdentity; 
      if (identity2 != null) 
      { 
       var result = identity2.FindFirstValue(IdentityConfig.Settings.GetAuthenticationOptions().RoleClaimType); 

       return null; // later result 
      } 
      return null; 
     } 
    } 
} 

但要求类型RoleClaimType结果总是null :( 我真的坚持了这一点。

谢谢您的帮助!斯特芬

+0

你有没有试过User.IsInRole(“字符串角色名称”)? – nocturns2

+1

或者你可以尝试:string [] userroles = Roles.GetRolesForUser(“username”) - 这应该返回一个userroles中的数组,您可以循环以确定它是否包含特定角色。 – nocturns2

回答

2

User.IsInRole基本上看索赔对于当前登录的用户来说,你的登录逻辑是什么样的?这就是负责把cookie变成用户身份的东西,这需要为IsInRole方法正确设置角色声明。

+0

我也需要这个! – janhartmann

+1

@JeremyCook你有没有得到解决方案。我已经实现了一个自定义的用户存储,而不是使用默认的实体框架。当[Authorize(Roles =“Admin”)]执行时,角色相关的方法不会被调用 –

+0

我找到了我的问题的来源并发布了答案[here](http://stackoverflow.com/questions/20428405/为什么,心不是-authorizeroles管理员 - 工作 - 在-MVC-5-RTM-与-ASP净identit/20433316#20433316)。 –

2

我想了解如何在MVC 5中使用角色我自己,这是什么使我在这里。我无法回答你的问题,但请查看此链接。下载的解决方案可以直接使用,我已经可以剪切并粘贴一些代码并在我自己的应用程序中运行。现在我试图完全理解它在做什么。

http://www.typecastexception.com/post/2013/11/11/Extending-Identity-Accounts-and-Implementing-Role-Based-Authentication-in-ASPNET-MVC-5.aspx

它可能不回答你的问题,但至少这是因为没有很多的麻烦所描述的,所以这是一个很好的起点,它实际工作完全可行的解决方案。