Как назначать роли пользователям, используя интерфейс веб-сайта в ASP.NET Core 2.1 - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь понять, как назначать роли пользователям в интерфейсе администратора моего веб-приложения, используя ядро ​​ASP.Net 2.1.

Я еще не нашел ответа.Мой идентификатор пользователя приложения основан на строках, а не на целых числах.

В настоящее время я могу редактировать пользователей, добавлять новых пользователей, добавлять новые роли, удалять роли, редактировать имена ролей, но не могу назначать роли пользователям.

В идеале я хотел бы иметь представление с двумя выпадающими списками.Один со всеми пользователями в нем и список доступных ролей, которые я могу назначить.

У кого-нибудь есть какие-либо советы о том, как этого добиться, пожалуйста?

Вот мой текущий контроллер ролей.Для контекста я использую шаблон репозитория.И реализовали несколько моделей идентичности, ApplicationUser, ApplicationUserRole и Application Role.

Роли controller.cs:

[Authorize(Roles = "Admin")]
public class RolesController : Controller
{

    private readonly UserManager<ApplicationUser> _userManager;
    private readonly RoleManager<ApplicationRole> _roleManager;
    private IRepository _repo;
    private readonly ApplicationDbContext _context;


    public RolesController(UserManager<ApplicationUser> userManager,
        RoleManager<ApplicationRole> roleManager, IRepository repo, ApplicationDbContext context)

    {
        _userManager = userManager;
        _roleManager = roleManager;
        _repo = repo;
        _context = context;

    }
    public IActionResult Index()
    {
        List<RoleListViewModel> model = new List<RoleListViewModel>();
        model = _roleManager.Roles.Select(r => new RoleListViewModel
        {
            RoleName = r.Name,
            Description = r.Description,
            Id = r.Id,
            NumberOfUsers = r.UserRoles.Count
        }).ToList();
        return View(model);
    }

    [AutoValidateAntiforgeryToken]

    public ActionResult Details(string id)
    {
        var role = _repo.GetRole((string)id);
        if (role == null)
        {
            return RedirectToAction("Index");
        }
        return View(role);
    }


    [HttpGet]
    public IActionResult Create()
    {
        return View();
    }

    [AutoValidateAntiforgeryToken]
    [HttpPost]
    public async Task<IActionResult> Create(RoleViewModel vm)
    {
        if (!ModelState.IsValid)
            return View(vm);
        {
            var role = new ApplicationRole
            { Name = vm.Name };
            var result = await _roleManager.CreateAsync(role);
            if (result.Succeeded)
            {
                _repo.AddRole(role);
                return RedirectToAction("Index");
            }
            else
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError("", error.Description);
                }
            return View(vm);
        }
    }

    [HttpGet]
    public ActionResult Delete(string Id)
    {
        var role = _context.Roles.Find(Id);
        if (role == null)
        {
            return RedirectToAction("Index");
        }
        return View(role);
    }

    [ValidateAntiForgeryToken]
    [HttpPost]
    public async Task<ActionResult> Delete([Bind(include: "Id,Name")]ApplicationRole myRole)
    {
        ApplicationRole role = _context.Roles.Find(myRole.Id);
        _context.Roles.Remove(role);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }


    [HttpGet]
    public IActionResult Edit(string Id)
    {
        var role = _repo.GetRole((string)Id);
        if (role == null)
        {
            return RedirectToAction("Index");
        }
        return View(new RoleViewModel { Id = role.Id, Name = role.Name, Description = role.Description });
    }

    [HttpPost]
    public async Task<IActionResult> Edit(RoleViewModel vm)
    {
        var role = await _roleManager.FindByIdAsync(vm.Id);
        if (vm.Name != role.Name)
        {
            role.Name = vm.Name;
        }
        if(vm.Description != role.Description)
        {
            role.Description = vm.Description;
        }
        var result = _roleManager.UpdateAsync(role).Result;

        if (result.Succeeded)
        {
            return RedirectToAction("Index", "Roles");
        }
        else return View(vm);
    }

    //[HttpGet]
    //public async Task<IActionResult> AssignRole(string Id)
    //{
    //    List<UserRolesViewModel> model = new List<UserRolesViewModel>();
    //    model = _userManager.Users.Select(r => new UserRolesViewModel
    //    {
    //        Email = u.Email,
    //        Description = r.Description,
    //        Id = r.Id,
    //        NumberOfUsers = r.UserRoles.Count
    //    }).ToList();
    //    return View(model);
    //}`

ApplicationUser.cs:

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; internal set; }
    public string LastName { get; internal set; }
    public virtual ICollection<IdentityUserClaim<string>> Claims { get; set; }
    public virtual ICollection<IdentityUserLogin<string>> Logins { get; set; }
    public virtual ICollection<IdentityUserToken<string>> Tokens { get; set; }
    public virtual IEnumerable<ApplicationRole> Roles { get; set; }
    public ICollection<ApplicationUserRole> UserRoles { get; set; }
    public ICollection<MainComment> MainComments { get; set; }   
}

ApplicationUserRole.cs

public class ApplicationUserRole : IdentityUserRole<string>
{
    public virtual ApplicationUser User { get; set; }
    public virtual ApplicationRole Role { get; set; }
}

ApplicationRole.cs

public class ApplicationRole : IdentityRole

{
    public ApplicationRole() : base() { }

    public ApplicationRole(string name)
        : base(name)
    { }
    public virtual ICollection<ApplicationUserRole> UserRoles { get; set; }
    public string Description { get; set; }  
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Если вы хотите назначить роль пользователю в MVC (протестировано в asp.net core 2.1), вы можете сделать следующее.Я также создал пользователя здесь, просто чтобы показать внедрение UserManager.

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;

namespace MyApp.Controllers
{

    public class RolesController : Controller
    {
        private readonly RoleManager<IdentityRole> _roleManager;
        private readonly UserManager<IdentityUser> _userManager; 

        public RolesController(RoleManager<IdentityRole> roleManager, UserManager<IdentityUser> userManager)
        {
            _roleManager = roleManager;
            _userManager = userManager;
        }

        [HttpPost]
        public async Task<IActionResult> AssignRoleToUser(string _roleName, string _userName)
        {
            //Created a user
            var user = new IdentityUser { UserName = _userName, Email = "xyz@somedomain.tld" };
            var result = await _userManager.CreateAsync(user, "[SomePassword]");
            if (result.Succeeded)
            {
                // assign an existing role to the newly created user
                await _userManager.AddToRoleAsync(user, "Admin");
            }            
            return View();
        }

    }
}
0 голосов
/ 04 января 2019

Ни в коем случае это не правильный способ сделать это или что-нибудь.

Я назначил роль не так давно, и это то, что я придумал.

Также роль «Администратор» не может быть назначена.Это можно просто закомментировать / удалить.и класс:

HomebreModel

содержит только строки

В представлении Назначить отображаются два раскрывающихся списка, один для пользователя, а другой для роли.

Контроллер

[Authorize(AuthenticationSchemes = HomebrewModel.BothAuthSchemes, Roles = HomebrewModel.RoleAdmin)]
public class RoleController : Controller
{
    private readonly RoleManager<IdentityRole> _roleManager;
    private readonly UserManager<NutricionUser> _userManager;

    public RoleController(RoleManager<IdentityRole> roleManager, UserManager<NutricionUser> userManager)
    {
        _roleManager = roleManager;
        _userManager = userManager;
    }

    // GET: Role
    public async Task<ActionResult> Index()
    {
        var adminRole = await _roleManager.FindByNameAsync(HomebrewModel.RoleAdmin);
        var assignableRoles = _roleManager.Roles.ToList();
        assignableRoles.RemoveAt(assignableRoles.IndexOf(adminRole));
        return View(assignableRoles);
    }

    // GET: Role/Assign
    public async Task<ActionResult> Assign()
    {
        var adminRole = await _roleManager.FindByNameAsync(HomebrewModel.RoleAdmin);
        var assignableRoles = _roleManager.Roles.ToList();
        assignableRoles.RemoveAt(assignableRoles.IndexOf(adminRole));
        ViewData["Name"] = new SelectList(assignableRoles, "Name", "Name");
        ViewData["UserName"] = new SelectList(_userManager.Users, "UserName", "UserName");
        return View(new RoleModel());
    }

    // POST: Role/Assign
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Assign(RoleModel roleModel)
    {
        if (ModelState.IsValid)
        {
            if(roleModel.Name == HomebrewModel.RoleAdmin)
            {
                ViewData["Message"] = "Invalid Request.";
                return View("Info");
            }
            var user = await _userManager.FindByEmailAsync(roleModel.UserName);
            if (user != null)
            {
                if (await _roleManager.RoleExistsAsync(roleModel.Name))
                {
                    if(await _userManager.IsInRoleAsync(user, roleModel.Name))
                    {
                        ViewData["Message"] = $@"User {roleModel.UserName} already has the {roleModel.Name} role.";
                        return View("Info");
                    }
                    else
                    {
                        await _userManager.AddToRoleAsync(user, roleModel.Name);
                        ViewData["Message"] = $@"User {roleModel.UserName} was assigned the {roleModel.Name} role.";
                        return View("Info");
                    }
                }
                else
                {
                    ViewData["Message"] = "Invalid Request.";
                    return View("Info");
                }
            }
            else
            {
                ViewData["Message"] = "Invalid Request.";
                return View("Info");
            }
        }
        return View(roleModel);
    }
}

И это виды.

Индекс

@{
    ViewData["Title"] = "Roles";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Roles</h2>

<p>
    <a asp-action="Assign">Assign</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                Roles
            </th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @item.Name
                </td>
            </tr>
        }
    </tbody>
</table>

Назначить

@model Models.RoleModel

@{
    ViewData["Title"] = "Assign";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Assign</h2>

<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Assign">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Name" class="control-label"></label>
                <select asp-for="Name" asp-items="(SelectList)@ViewData["Name"]"></select>
            </div>
            <div class="form-group">
                <label asp-for="UserName" class="control-label"></label>
                <select asp-for="UserName" asp-items="(SelectList)@ViewData["UserName"]"></select>
            </div>
            <div class="form-group">
                <input type="submit" value="Assign" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to list.</a>
</div>

А это класс RoleModel

public class RoleModel
{
    [Display(Name = "Name")]
    public string Name { get; set; }
    [Display(Name = "UserName")]
    public string UserName { get; set; }
}

Просмотр информации также

@{
    ViewData["Title"] = "Info";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Info</h2>
<h3>@ViewData["Message"]</h3>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...