programing

Asp.net Identity MVC 5에서 역할 만들기

nasanasas 2020. 10. 5. 08:00
반응형

Asp.net Identity MVC 5에서 역할 만들기


새로운 Asp.net Identity Security Framework 사용에 대한 문서는 거의 없습니다.

새로운 역할을 만들고 여기에 사용자를 추가 할 수있는 방법을 모았습니다. 다음을 시도했습니다. 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();
    }

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

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

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

역할을 만드는 데 사용하는 방법은 다음과 같으며 코드에서 사용자에게 할당하는 방법도 나열되어 있습니다. 아래 코드는 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();

If you are using the default template that is created when you select a new ASP.net Web application and selected Individual User accounts as Authentication and trying to create users with Roles so here is the solution. In the Account Controller's Register method which is called using [HttpPost], add the following lines in if condition.

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

This will create first create a role in your database and then add the newly created user to this role.

참고URL : https://stackoverflow.com/questions/19697226/creating-roles-in-asp-net-identity-mvc-5

반응형