Asp.net Identity MVC 5에서 역할 생성


85

새로운 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));
    }
}

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

답변:


26

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

public class MyContext : IdentityDbContext<MyUser>

또는

public class MyContext : IdentityDbContext

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


4
귀하의 답변에 감사드립니다. 이제 모든 것이 작동합니다. 맥락을 확인한 것은 나를 올바른 방향으로 이끌었습니다. asp.net ID가 생성되면 IdentityDbContext를 확장하는 새 컨텍스트 (ApplicationDbContext)가 생성됩니다. 내 코드에서 IdentityDbContext를 확장하지 않은 원래 컨텍스트를 참조했습니다. 다른 사람이이 문제가있는 경우 컨텍스트를 확인하고 APP_DATA 디렉터리를 다시 확인하여 실수로 두 개의 데이터베이스를 생성하지 않았는지 확인하십시오.
colbyJax

74

여기 있습니다 :

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
특히 마이그레이션을 사용하지 않았기 때문에 도움이되었습니다. DropCreateDatabaseAlways를 사용하고 있습니다.
J86

내 문제는 잘못된 컨텍스트를 사용하고 있다는 것입니다. 두 개의 연결 문자열을 만들었습니다. 하나는 호출 IdentityDbContext되었고 다른 하나는 사용자 지정 컨텍스트를 사용했기 때문에 제안을 사용할 때 AppilcationDbContext()작동했습니다.
megamaiku

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

25

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

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

이 helpls 희망

감사


1
블로그는 좋은이지만, 오래된, 당신은 계정 컨트롤러를 업데이트 할 수 있습니다
애기

이미 ASP.NET MVC 5에 대한 것입니다 (어떤 업데이트를 찾고 있습니까?). 기사에 지정된 GitHub 링크에서 소스 코드를 다운로드 할 수 있습니다.
Sheo 나라 얀

1
이러한 기능 중 일부는 최신 2.2.0에서 사용되지 않는 것 같습니다. 1) 현재 버전에서 동일한 코드를 사용할 수 있습니까? 2) Guid에서 이메일로 기본 키를 어떻게 변경할 수 있습니까? 3) recpatcha를 Identity와 통합하는 방법에 대한 권장 사항은 감사하겠습니다. j.mp/1nohaHe
aggie

15

에서는 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
{
}

services.AddIdentity<UserAuth, IdentityRole>().AddRoleManager<ApplicationRoleManager>()services직접 추가 할 수 없었습니다 .
Alex C

2
@AlexC, 죄송합니다. 가능한 한 간단하게 유지하고 AddIdentity를 제거했습니다. 결정된.
nothrow

1
그래서이 코드를 독립 실행 형 프로젝트 github.com/AlexChesser/AspnetIdentitySample/commit/…에 추가 했고 AspnetRoles가 성공적으로 생성되었지만 어떤 이유로 페이지가 'whitescreens'가됩니다 (500 오류라고 가정하지만 스택 트레이스 없음)이 설치된 페이지를 렌더링 할 수 있었습니까?
Alex C

ok-이 커밋은 화이트 스크린 오류 github.com/AlexChesser/AspnetIdentitySample/commit/…을 수정합니다. VerifyRolesCreated 내에서 Task 대신 void로 전환했습니다.
Alex C

1
'EnsureRolesCreated'가 void를 반환하는 것은 구성이 완료되기 전에 역할이 생성되지 않았 음을 의미 할 수 있습니다.
nothrow

6

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

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

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

3

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


2

역할보기 모델

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

1

역할 추가를위한 또 다른 솔루션을 공유하고 싶었습니다.

<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" />
}

제어 장치:

    [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

새 ASP.net 웹 응용 프로그램을 선택하고 개별 사용자 계정을 인증으로 선택하고 역할이있는 사용자를 만들려고 할 때 생성되는 기본 템플릿을 사용하는 경우 여기에 해결책이 있습니다. [HttpPost]를 사용하여 호출되는 Account Controller의 Register 메서드에서 if condition.

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

이렇게하면 먼저 데이터베이스에 역할을 만든 다음 새로 만든 사용자를이 역할에 추가합니다.


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

0

역할을 만드는 데 사용하는 방법은 다음과 같으며 코드에서 사용자에게 할당하는 방법도 나열되어 있습니다. 아래 코드는 migrations 폴더의 "configuration.cs"에 있습니다.

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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.