[c#] Asp.net Identity MVC 5에서 역할 생성

새로운 Asp.net ID 보안 프레임 워크 사용에 대한 문서는 거의 없습니다.

새로운 역할을 만들고 여기에 사용자를 추가 할 수있는 방법을 모았습니다. 다음을 시도했습니다. ASP.NET ID에 역할 추가

이 블로그에서 정보를 얻은 것 같습니다. asp.net ID를 사용하여 간단한 할 일 애플리케이션을 구축하고 사용자를 할 일과 연결

모델이 변경 될 때마다 실행되는 데이터베이스 이니셜 라이저에 코드를 추가했습니다. RoleExists다음 오류와 함께 함수에서 실패합니다 .

System.InvalidOperationException mscorlib.dll에서 발생했습니다. 엔티티 유형 IdentityRole이 현재 컨텍스트에 대한 모델의 일부가 아닙니다.

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

도움을 주시면 감사하겠습니다.



답변

MyContext수업의 다음 서명이 있는지 확인하십시오.

public class MyContext : IdentityDbContext<MyUser>

또는

public class MyContext : IdentityDbContext

코드는 수정없이 나를 위해 작동합니다!


답변

여기 있습니다 :

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

    }


답변

다음은 ASP.NET Identity를 사용하여 역할을 만들고, 역할을 수정하고, 역할을 삭제하고, 역할을 관리하는 방법을 설명하는 전체 문서입니다. 여기에는 사용자 인터페이스, 컨트롤러 메서드 등도 포함됩니다.

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

이 helpls 희망

감사


답변

에서는 ASP.NET 5 rc1-final다음을 수행했습니다.

만들어진 ApplicationRoleManager ( ApplicationUser템플릿 으로 생성 된 것과 유사한 방식 )

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)
    {
    }
}

ConfigureServicesStartup.cs, 나는으로 roleManager로 추가

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

새 역할을 생성하려면 Configure다음 에서 호출하십시오 .

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();
     ...
}

이제 규칙을 사용자에게 할당 할 수 있습니다.

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

또는 Authorize속성에 사용

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


답변

위의 Peters 코드에 대한 개선으로 다음을 사용할 수 있습니다.

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

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


답변

EF 6.0에서 Peter Stulinski와 Dave Gordon의 코드 샘플을 사용할 때 내 응용 프로그램이 시작시 중단되었습니다. 나는 변했다 :

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

…에

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

시드 메서드에서 다른 인스턴스를 인스턴스화하지 않으려는 경우 의미가 ApplicationDBContext있습니다. 이것은 내가 Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());생성자에 있었다는 사실에 의해 복합되었을 수 있습니다.ApplicationDbContext


답변

역할보기 모델

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

컨트롤러 방식

    [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();
    }