2010-01-14 36 views
22

Có cách nào để nhận vai trò rõ ràng mà người dùng thuộc về bộ điều khiển của tôi không? Điều này giả định sử dụng ASP.NET Membership và Role Providers. "IsInRole" không hoạt động - tôi cần thực sự có được tên của vai trò của họ.nhận vai trò của người dùng hiện tại

Trả lời

24

Bạn có thể nhận danh sách Vai trò từ phương pháp GetRoles. (Từ liên kết)

string[] rolesArray; 

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

Đối với những người khác chạy vào trong này, nếu bạn chạy vào một lỗi ở đây về vai trò quản lý không được kích hoạt, pop vào cấu hình web của bạn, tìm ra nguyên tố roleManager và set enabled =" đúng "như một thuộc tính. – MisterJames

25

Một người sử dụng có thể ở nhiều hơn một vai trò, do đó bạn không thể có được vai trò một mà người dùng đang ở trong, nhưng bạn có thể dễ dàng nhận được các danh sách vai trò một sử dụng là trong

bạn có thể sử dụng các loại Roles để có được danh sách các vai trò mà hiện đang đăng nhập sử dụng trong:.

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

Hoặc nếu bạn muốn nhận được vai trò của một thành viên tùy ý bạn có thể pa ss trong tên người dùng khi bạn gọi Roles.GetRolesForUser().

+0

Và cách lấy dữ liệu cụ thể của người dùng tùy chỉnh như DOB? – xameeramir

+2

@zameeramir có vẻ giống như một câu hỏi riêng biệt tốt để hỏi về StackOverflow. – Eilon

+0

tại đây là: http://stackoverflow.com/questions/30216915/how-to-get-user-profile-data-from-asp-net-mvc-custom-identityuser-model/30217188#30217188 – xameeramir

12

Bạn có thể nhận vai trò của người dùng hiện tại bằng Roles.GetRolesForUser().

Để kiểm tra xem một người dùng thuộc về một vai trò ở đây là những gì tôi đã làm:

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

Bạn cũng có thể kiểm tra xem người dùng có trong vai trò bằng cách thực hiện 'User.IsInRole (" RoleName ")' –

+0

câu trả lời của Scotty.NET (trong nhận xét cho câu trả lời này) có vẻ là cách tốt hơn (nhanh hơn) để kiểm tra xem người dùng có thuộc về với một vai trò nhất định đối với tôi. – VoidKing

10

Simplemembership trong MVC4:

Lấy của role-

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

Để kiểm tra xem tài khoản người dùng thuộc một vai trò nhất định-

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

Tôi không biết nếu tôi thiếu cài đặt hoặc thiết lập lạ, nhưng tôi không thể nhận được ví dụ User.IsInRole hoặc Roles.GetRolesForUser() để hoạt động. Tôi chỉ nhận được một ngoại lệ (tôi nghĩ rằng tham chiếu null), và các ứng dụng chỉ dừng lại. Mặc dù tôi đã cấu hình một RoleManager cho OwinContext và một phương thức Create, ví dụ như trong dự án Identity Sample của Microsoft, cũng như cho phép Role Manager trong web.config. tôi giải quyết này lúc đầu sử dụng cách tiếp cận khác, như thế này (db là 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(); 

Điều này có thể không phải là cách tối ưu nhất và có thể có thể được thay đổi để một hình thức đơn giản hơn nhưng nó làm việc cho tôi và có thể không đòi hỏi nhiều thiết lập/phụ thuộc như các cách tiếp cận khác. Cách tiếp cận thứ hai được này (thêm này đến lớp điều khiển của bạn):

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; 
     } 
    } 

Bên trong điều khiển của bạn bây giờ bạn có thể làm ví dụ:

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

Tôi đang sử dụng ASP.NET MVC 5 ứng dụng chỉ để rõ ràng. Trình quản lý vai trò không được sử dụng trong ví dụ này nhưng có thể được sử dụng để tạo, tìm kiếm, cập nhật vai trò v.v. Sử dụng phương pháp này cho phép các cuộc gọi không đồng bộ sử dụng đang chờ, trong trường hợp đó là một lợi ích cho ứng dụng của bạn.

0

tôi Sử dụng mã này

((ClaimsIdentity)User.Identity).FindAll(ClaimTypes.Role).ToList() 
.OrderBy(x => x.Value == "admin" ? 1 
: x.Value == "Salesperson" ? 2 
: x.Value == "User" ? 3 : 4).First().Value 
Các vấn đề liên quan