2015-02-02 21 views
15

Tôi khá mới với asp.net mvc và tôi đã xem xét nhiều cách khác nhau để thêm Vai trò người dùng cho trang web mvc asp của tôi. Tôi muốn sử dụng (các) cơ sở dữ liệu người dùng là được tự động tạo cho bạn khi bạn tạo một dự án mvc mới. Đó chứa các bảng:Cách thêm vai trò người dùng đơn giản - Asp.net MVC C#

  • AspNetRoles
  • AspNetUserClaims
  • AspNetUserLogins
  • AspNetUserRoles
  • AspNetUsers

Tôi đã nhìn vào một vài hướng dẫn và đó là một chút của một mindfield cho người mới bắt đầu tôi nghĩ.

Tất cả tôi muốn để có thể làm là một cái gì đó như thế này

[Authorize(Roles = "admin")] 
public ActionResult Index() 
{ 
    Return View(); 
} 

Vì vậy, người sử dụng với các quản trị vai trò có thể truy cập các trang chỉ mục. Tất cả trợ giúp được sắp xếp theo thứ tự.

+0

nào bạn muốn thêm vai trò sử dụng giao diện người dùng? hoặc bạn sẽ nhớ sử dụng kịch bản lệnh sql đơn giản để thực hiện điều đó và gán các vai trò đó khi đăng ký người dùng? – DSR

+0

Rất nhiều tài liệu về vai trò có sẵn trong google. Có nhiều hơn một chút so với bạn đã bao gồm. Tại sao không cung cấp cho một trong những hướng dẫn một thử và cho chúng tôi biết nếu bạn gặp khó khăn hơn là yêu cầu chúng tôi làm điều đó cho bạn. Mục đích chính của bài đăng của tôi là giới thiệu một phương án thay thế: http://visualstudiomagazine.com/articles/2013/08/01/leveraging-claims-based-security-in-aspnet-45.aspx – RandomUs1r

+0

@DSR Id thích người dùng có vai trò quản trị viên để thêm vai trò cho người dùng khác bằng cách sử dụng ui – Rob

Trả lời

27

Bước đầu tiên là tạo vai trò admin. Đây là dễ dàng đủ:

context.Roles.Add(new IdentityRole { Name = "admin" }); 
context.SaveChanges(); 

Để thêm vai trò của một người dùng hiện có:

var role = context.Roles.SingleOrDefault(m => m.Name == "admin"); 
user.Roles.Add(new IdentityUserRole { RoleId = role.Id }); 

Cả hai bước này có thể và cần được xử lý theo phương pháp Seed lại Migrations\Configuration.cs, cùng với việc tạo ra bất kỳ người dùng ban đầu đó phải là quản trị viên.

Để khả năng quản trị viên thêm vai trò cho người dùng khác, bạn đã có bước đầu tiên được bảo vệ: bảo vệ hành động với [Authorize(Roles = "admin")].

Tiếp theo, bạn sẽ cần một mô hình xem để làm việc với người dùng của mình. Một cái gì đó như sau:

public class UserViewModel 
{ 
    // user properties you'd like to edit here 

    public List<int> SelectedRoleIds { get; set; } 

    public IEnumerable<SelectListItem> RoleChoices { get; set; } 
} 

Bạn sẽ cần phải bản đồ ApplicationUser của bạn đến/từ mô hình chế độ xem này.Sau đó, bạn sẽ cần phải tự cư hai thuộc tính trong vai trò UserViewModel:

RoleChoices phải là một đếm được của tất cả các vai trò có sẵn:

model.RoleChoices = context.Roles.Select(m => new SelectListItem 
{ 
    Value = m.Id, 
    Text = m.Name 
}); 

SelectedRoleIds phải là một danh sách các id của tất cả các vai trò hiện giao cho người sử dụng:

model.SelectedRoleIds = user.Roles.Select(m => m.RoleId); 

Theo quan điểm của bạn, sau đó, bạn sẽ xây dựng multiselect của bạn:

@Html.ListBoxFor(m => m.SelectedRoleIds, Model.RoleChoices) 

Khi tạo một người dùng mới, bạn chỉ có thể thiết lập vai trò của người sử dụng trực tiếp trên bài:

user.Roles = model.SelectedRoleIds.Select(m => new IdentityUserRole { RoleId = m }); 

Khi chỉnh sửa một người dùng hiện, chăm sóc nhiều hơn phải được thực hiện, vì bạn sẽ nhận được lỗi vẹn nếu bạn lưu cùng một id vai trò hai lần cho cùng một người dùng. Trước tiên, bạn sẽ cần phải loại bỏ bất kỳ vai trò đã được bỏ chọn:

user.Roles.Where(m => !model.SelectedRoleIds.Contains(m.RoleId)) 
    .ToList().ForEach(role => user.Roles.Remove(role)); 

Sau đó, bạn sẽ cần phải thêm bất kỳ vai trò mới chọn:

var existingUserRoles = user.Roles.Select(m => m.RoleId); 
model.SelectedRoleIds.Except(existingUserRoles) 
    .ToList().ForEach(roleId => user.Roles.Add(new IdentityUserRole 
    { 
     RoleId = roleId 
    })); 
+0

Cảm ơn bạn rất nhiều vì đã dành thời gian cho việc này, tôi sẽ thử ngay bây giờ: D – Rob

Các vấn đề liên quan