Tạo vai trò trong Asp.net Identity MVC 5


85

Có rất ít tài liệu về cách sử dụng Khung bảo mật danh tính Asp.net mới.

Tôi đã tổng hợp những gì tôi có thể thử và tạo một Vai trò mới và thêm Người dùng vào đó. Tôi đã thử những cách sau: Thêm vai trò trong ASP.NET Identity

có vẻ như nó có thể đã nhận được thông tin từ blog này: xây dựng một ứng dụng việc cần làm đơn giản với danh tính asp.net và liên kết người dùng với việc cần làm

Tôi đã thêm mã vào Trình khởi tạo cơ sở dữ liệu được chạy bất cứ khi nào mô hình thay đổi. Nó không thành công trên RoleExistschức năng với lỗi sau:

System.InvalidOperationException xảy ra trong mscorlib.dll Loại thực thể IdentityRole không phải là một phần của mô hình cho ngữ cảnh hiện tại.

protected override void Seed (MyContext context)
{
    var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); 
    var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));

    // Create Admin Role
    string roleName = "Admins";
    IdentityResult roleResult;

    // Check to see if Role Exists, if not create it
    if (!RoleManager.RoleExists(roleName))
    {
        roleResult = RoleManager.Create(new IdentityRole(roleName));
    }
}

Bất kỳ trợ giúp được đánh giá cao.

Câu trả lời:


26

Xác minh rằng bạn có chữ ký sau của MyContextlớp mình

public class MyContext : IdentityDbContext<MyUser>

Hoặc là

public class MyContext : IdentityDbContext

Mã đang làm việc cho tôi, không có bất kỳ sửa đổi nào !!!


4
Cảm ơn mọi người vì đã đáp trả bạn. Mọi thứ hiện đang hoạt động. Kiểm tra bối cảnh đã dẫn tôi đi đúng hướng. Khi danh tính asp.net được tạo, nó tạo ra một bối cảnh mới (ApplicationDbContext) mở rộng IdentityDbContext. Trong mã của tôi, tôi đang tham chiếu đến ngữ cảnh ban đầu của mình không mở rộng IdentityDbContext. Nếu ai đó gặp sự cố này, hãy kiểm tra ngữ cảnh của bạn và kiểm tra kỹ thư mục APP_DATA của bạn để đảm bảo rằng bạn không vô tình tạo hai cơ sở dữ liệu.
colbyJax

74

Chúng ta bắt đầu:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));


   if(!roleManager.RoleExists("ROLE NAME"))
   {
      var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();
      role.Name = "ROLE NAME";
      roleManager.Create(role);

    }

2
Điều này đã giúp tôi, đặc biệt là vì tôi không sử dụng Migrations. Tôi đang sử dụng DropCreateDatabaseAlways.
J86

Vấn đề của tôi là tôi đã sử dụng sai ngữ cảnh. Tôi đã tạo hai chuỗi kết nối, một được gọi IdentityDbContextvà một chuỗi khác, tôi đang sử dụng ngữ cảnh tùy chỉnh, vì vậy khi tôi sử dụng đề xuất của bạn AppilcationDbContext(), nó đã hoạt động.
megamaiku

var roleManager = new RoleManager <IdentityRole> (new RoleStore <IdentityRole> (db));
Nour Lababidi

25

Đây là bài viết hoàn chỉnh mô tả cách tạo vai trò, sửa đổi vai trò, xóa vai trò và quản lý vai trò bằng ASP.NET Identity. Điều này cũng bao gồm giao diện người dùng, phương pháp bộ điều khiển, v.v.

http://www.dotnetfunda.com/articles/show/2898/working-with-roles-in-aspnet-identity-for-mvc

Hy vọng điều này hữu ích

Cảm ơn


1
Blog của bạn là tốt đẹp, nhưng trong ngày, bạn có thể cập nhật bộ điều khiển tài khoản
Aggie

Nó đã có cho ASP.NET MVC 5 (Bạn đang tìm kiếm bản cập nhật nào?). Bạn có thể tải xuống mã nguồn từ liên kết GitHub được chỉ định trong bài viết.
Sheo Narayan

1
Một số chức năng đó dường như không được chấp nhận từ phiên bản mới nhất 2.2.0. 1) Tôi có thể sử dụng cùng mã trong phiên bản hiện tại 2) làm thế nào tôi có thể thay đổi khóa chính từ Guid để gửi email cho 3) bất kỳ khuyến nghị về cách tích hợp recpatcha đậm đà bản sắc sẽ được đánh giá j.mp/1nohaHe
Aggie

15

Trong ASP.NET 5 rc1-final, tôi đã làm như sau:

Đã tạo ApplicationRoleManager(theo cách tương tự như được ApplicationUsertạo theo mẫu)

public class ApplicationRoleManager : RoleManager<IdentityRole>
{
    public ApplicationRoleManager(
        IRoleStore<IdentityRole> store,
        IEnumerable<IRoleValidator<IdentityRole>> roleValidators,
        ILookupNormalizer keyNormalizer,
        IdentityErrorDescriber errors,
        ILogger<RoleManager<IdentityRole>> logger,
        IHttpContextAccessor contextAccessor)
        : base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor)
    {
    }
}

Để ConfigureServicesvào Startup.cs, tôi đã thêm nó làm RoleManager

services.
    .AddIdentity<ApplicationUser, IdentityRole>()
    .AddRoleManager<ApplicationRoleManager>();

Để tạo các Vai trò mới, hãy gọi từ Configuresau:

public static class RoleHelper
{
    private static async Task EnsureRoleCreated(RoleManager<IdentityRole> roleManager, string roleName)
    {
        if (!await roleManager.RoleExistsAsync(roleName))
        {
            await roleManager.CreateAsync(new IdentityRole(roleName));
        }
    }
    public static async Task EnsureRolesCreated(this RoleManager<IdentityRole> roleManager)
    {
        // add all roles, that should be in database, here
        await EnsureRoleCreated(roleManager, "Developer");
    }
}

public async void Configure(..., RoleManager<IdentityRole> roleManager, ...)
{
     ...
     await roleManager.EnsureRolesCreated();
     ...
}

Bây giờ, các quy tắc có thể được chỉ định cho người dùng

await _userManager.AddToRoleAsync(await _userManager.FindByIdAsync(User.GetUserId()), "Developer");

Hoặc được sử dụng trong Authorizethuộc tính

[Authorize(Roles = "Developer")]
public class DeveloperController : Controller
{
}

services.AddIdentity<UserAuth, IdentityRole>().AddRoleManager<ApplicationRoleManager>() Tôi không thể thêm nó vào servicestrực tiếp.
Alex C

2
@AlexC, Xin lỗi, tôi tệ quá. Tôi đã cố gắng giữ cho nó càng đơn giản càng tốt và đã xóa AddIdentity. Đã sửa.
nothrow

1
Vì vậy, tôi đã thêm mã đó vào một dự án độc lập github.com/AlexChesser/AspnetIdentitySample/commit/… và AspnetRoles đã được tạo thành công, nhưng vì một số lý do, các trang trở thành 'màn hình trắng' (tôi cho rằng lỗi 500, nhưng không có stacktrace) bạn có thể hiển thị các trang được cài đặt này không?
Alex C

ok - cam kết này sửa lỗi màn hình trắng github.com/AlexChesser/AspnetIdentitySample/commit/… thông báo rằng trong EnsureRolesCreate tôi đã chuyển nó thành một khoảng trống thay vì Task.
Alex C

1
có 'EnsureRolesCreated' trở lại khoảng trống có nghĩa là vai trò không được tạo ra trước khi cấu hình kết thúc
nothrow

6

Là một cải tiến về mã Peters ở trên, bạn có thể sử dụng điều này:

   var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

   if (!roleManager.RoleExists("Member"))
            roleManager.Create(new IdentityRole("Member"));

3

Ứng dụng của tôi bị treo khi khởi động khi tôi sử dụng các mẫu mã của Peter Stulinski & Dave Gordon với EF 6.0. Tôi đã thay đổi:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

đến

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(**context**));

Điều này có ý nghĩa khi trong phương thức hạt giống, bạn không muốn khởi tạo một phiên bản khác của ApplicationDBContext. Điều này có thể được kết hợp bởi thực tế là tôi đã có Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());trong hàm tạo củaApplicationDbContext


2

Mô hình xem vai trò

public class RoleViewModel
{
    public string Id { get; set; }
    [Required(AllowEmptyStrings = false)]
    [Display(Name = "RoleName")]
    public string Name { get; set; }
}

Phương pháp điều khiển

    [HttpPost]
    public async Task<ActionResult> Create(RoleViewModel roleViewModel)
    {
       if (ModelState.IsValid)
       {
           var role = new IdentityRole(roleViewModel.Name);
           var roleresult = await RoleManager.CreateAsync(role);
           if (!roleresult.Succeeded)
           {
               ModelState.AddModelError("", roleresult.Errors.First());
               return View();
           }
           return RedirectToAction("some_action");
       }
       return View();
    }

1

Tôi muốn chia sẻ một giải pháp khác để thêm vai trò:

<h2>Create Role</h2>

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<span class="label label-primary">Role name:</span>
<p>
    @Html.TextBox("RoleName", null, new { @class = "form-control input-lg" })
</p>
<input type="submit" value="Save" class="btn btn-primary" />
}

Bộ điều khiển:

    [HttpGet]
    public ActionResult AdminView()
    {
        return View();
    }

    [HttpPost]
    public ActionResult AdminView(FormCollection collection)
    {
        var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

        if (roleManager.RoleExists(collection["RoleName"]) == false)
        {
            Guid guid = Guid.NewGuid();
            roleManager.Create(new IdentityRole() { Id = guid.ToString(), Name = collection["RoleName"] });
        }
        return View();
    }

1

Nếu bạn đang sử dụng mẫu mặc định được tạo khi bạn chọn một ứng dụng Web ASP.net mới và chọn tài khoản Người dùng Cá nhân làm Xác thực và cố gắng tạo người dùng có Vai trò thì đây là giải pháp. Trong phương thức Đăng ký của Bộ kiểm soát Tài khoản được gọi bằng [HttpPost], hãy thêm các dòng sau vào if condition.

sử dụng Microsoft.AspNet.Identity.EntityFramework;

var user = new ApplicationUser { UserName = model.Email, Email = model.Email };

var result = await UserManager.CreateAsync(user, model.Password);

if (result.Succeeded)
{
  var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
  var roleManager = new RoleManager<IdentityRole>(roleStore);
  if(!await roleManager.RoleExistsAsync("YourRoleName"))
     await roleManager.CreateAsync(new IdentityRole("YourRoleName"));

  await UserManager.AddToRoleAsync(user.Id, "YourRoleName");
  await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
  return RedirectToAction("Index", "Home");
}

Điều này sẽ tạo trước tiên tạo một vai trò trong cơ sở dữ liệu của bạn và sau đó thêm người dùng mới được tạo vào vai trò này.


0
    public static void createUserRole(string roleName)
    {
        if (!System.Web.Security.Roles.RoleExists(roleName))
        {
            System.Web.Security.Roles.CreateRole(roleName);
        }
    }

0

phương pháp tôi sử dụng để tạo vai trò ở bên dưới, việc gán chúng cho người dùng trong mã cũng được liệt kê. mã dưới đây nằm trong "config.cs" trong thư mục di chuyển.

string [] roleNames = { "role1", "role2", "role3" };
var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));

                IdentityResult roleResult;
                foreach(var roleName in roleNames)
                {
                    if(!RoleManager.RoleExists(roleName))
                    {
                        roleResult = RoleManager.Create(new IdentityRole(roleName));
                    }
                }
                var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
                UserManager.AddToRole("user", "role1");
                UserManager.AddToRole("user", "role2");
                context.SaveChanges();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.