2010-01-14 14 views
22

내 컨트롤러에서 사용자가 속한 명시적인 역할을 얻는 방법이 있습니까? 여기서는 ASP.NET 멤버쉽 및 역할 공급자를 사용한다고 가정합니다. "IsInRole"이 작동하지 않습니다. 실제로 그들이 속한 역할의 이름을 알아야합니다.현재 사용자의 역할 가져 오기

답변

24

GetRoles 메서드에서 역할 목록을 가져올 수 있습니다.

string[] rolesArray; 

    public void Page_Load() 
    { 
     RolePrincipal r = (RolePrincipal)User; 
     rolesArray = r.GetRoles(); 
     ...//extra code 
    } 
+8

를 사용하여 "= 활성화으로 roleManager 요소 및 세트를 찾아 웹 설정에 팝업 true "를 속성으로 사용합니다. – MisterJames

25

(링크에서) 당신이 사용자에 있다는 하나 역할을 얻을 수 있도록 사용자는 하나 개 이상의 역할을 할 수 있지만, 당신은 쉽게 역할 목록를 얻을 수 있습니다 사용자에

당신은 현재 로그인 한 사용자에 역할 목록 얻기 위해 Roles 유형을 사용할 수 있습니다. 당신은 임의의 사용자에 대한 역할을 얻으려면 당신이 할 수있는

public ActionResult ShowUserRoles() { 
    string[] roleNames = Roles.GetRolesForUser(); 
    return View(roleNames); 
} 

또는를 아빠 Roles.GetRolesForUser()에 전화 할 때 사용자 이름에 ss.

+0

DOB와 같은 사용자 지정 사용자 지정 데이터를 얻는 방법? – xameeramir

+2

@zameeramir StackOverflow에서 묻는 좋은 별도의 질문처럼 들립니다. – Eilon

+0

여기에 있습니다 : http://stackoverflow.com/questions/30216915/how-to-get-user-profile-data-from-asp-net-mvc-custom-identityuser-model/30217188#30217188 – xameeramir

12

Roles.GetRolesForUser()으로 현재 사용자의 역할을 가져올 수 있습니다.

사용자가 여기에 역할에 속하는 경우

확인하려면 내가 무슨 짓을 : MVC4에서

Roles.GetRolesForUser().Contains("Administrator") 
+6

User.IsInRole ("RoleName")' –

+0

Scotty.NET의 답변 (이 답변에 대한 댓글에서)이 사용자가 속한 것인지 확인하는 것이 더 빠르고 (더 빠른) 방법 인 것처럼 보입니다. 나에게 어떤 역할로. – VoidKing

10

Simplemembership :

얻기 사용자의 역할 -

var role = System.Web.Security.Roles.GetRolesForUser().Single(); 

있는지 확인하려면 사용자가 특정 역할에 속함 -

if (User.IsInRole("External")) 
2

몇 가지 이상한 설정이나 설정이 누락 된 것인지 모르겠지만 예를 들어 볼 수 없습니다. User.IsInRole 또는 Roles.GetRolesForUser()이 작동합니다. 난 그냥 예외 (나는 null 참조), 그리고 응용 프로그램이 막 중단 얻을. 비록 OwinContext와 Create 메소드와 같은 RoleManager를 Microsoft의 Identity 샘플 프로젝트와 같이 구성하고 web.config의 Role Manager를 사용할 수 있도록 설정했습니다. 나는 (데시벨은 ApplicationDbContext이다)과 같은 다른 방법을 사용하여 처음에이 문제를 해결 :

var UserID = User.Identity.GetUserId();  
var userRoles = db.Roles.Include(r => r.Users).ToList(); 

var userRoleNames = (from r in userRoles 
          from u in r.Users 
          where u.UserId == UserID 
          select r.Name).ToList(); 

이 가장 최적화 된 방법이 될 수 없으며 아마도 더 간단 양식으로 변경 될 수 있지만 나를 위해 일한 월 다른 접근법만큼 많은 설정/종속성을 요구하지 않습니다. 두 번째 방법이 (컨트롤러 클래스에이를 추가)된다

private ApplicationDbContext db = new ApplicationDbContext(); 
    private ApplicationUserManager _userManager; 
    public ApplicationUserManager UserManager 
    { 
     get 
     { 
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
     set 
     { 
      _userManager = value; 
     } 
    } 

    private ApplicationRoleManager _roleManager; 
    public ApplicationRoleManager RoleManager 
    { 
     get 
     { 
      return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>(); 
     } 
     private set 
     { 
      _roleManager = value; 
     } 
    } 

을 컨트롤러 내부에서 지금 예를 수행 할 수 있습니다

var UserID = User.Identity.GetUserId(); 
var RolesForUser = await UserManager.GetRolesAsync(UserID); 

를 그냥에 ASP.NET MVC 5 응용 프로그램을 사용하고 있습니다 명확하게. RoleManager는이 예제에서는 사용되지 않지만 역할을 생성, 검색, 업데이트하는 데 사용될 수 있습니다. 이 방법을 사용하면 애플리케이션에 이점이있는 경우 await을 사용하여 비동기 호출을 수행 할 수 있습니다.

0

난 당신이 역할 관리자 여기에 대해 오류로 실행하면 활성화되지 않는이로 실행 다른 사람을 위해이 코드

((ClaimsIdentity)User.Identity).FindAll(ClaimTypes.Role).ToList() 
.OrderBy(x => x.Value == "admin" ? 1 
: x.Value == "Salesperson" ? 2 
: x.Value == "User" ? 3 : 4).First().Value 
관련 문제