Аутентификация пользователя по идентификатору, записанному в базе данных - PullRequest
0 голосов
/ 09 апреля 2019

У меня следующая проблема: у меня есть модель событий, которая содержит данные о событии и организаторе (пользователь, который его создал - идентификатор пользователя).Я хочу сделать возможность Редактировать / Удалить это событие только создателем.Я не знаю, как сравнить идентификатор пользователя из базы данных с идентификатором реального пользователя, который хочет выполнить действие.

Должен ли я добавить авторизацию в методах редактирования / удаления в Event Model Controler или есть другой способпроверить этот идентификатор?

EventsModelController:

        [HttpPost]
        public async Task<IActionResult> Index(string placeString, string nameString, DateTime data, DateTime time)
        {
            if(HttpContext.User.Identity.IsAuthenticated) ViewBag.userID = HttpContext.User.Identity.Name.ToString();
            var events = from e in _context.EventsModel
                         select e;
            return View(await events.ToListAsync());
        }

        [HttpPost]
        [Authorize]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("id,event_type,date,place,name,hour,tickets,tickets_per_person,organisator")] EventsModel eventsModel)
        {
            var userID = HttpContext.User.Identity.Name;
            eventsModel.organisator = userID;
            if (ModelState.IsValid)
            {
                _context.Add(eventsModel);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            return View(eventsModel);
        }

Я использую ViewBag для отображения параметров для удаления / удаления (просмотр индекса):

             <td>
                @if (ViewBag.userID == item.organisator)
                 {
                    <a asp-action="Edit" asp-route-id="@item.id">Edit</a> 
                 }
                | <a asp-action="Details" asp-route-id="@item.id">Details</a> |
                @if (ViewBag.userID == item.organisator)
                 {
                    <a asp-action="Delete" asp-route-id="@item.id">Delete</a>
                 }
            </td>

На данный момент,Только создатель может видеть опции Edit и Delete в списке событий, но у всех есть доступ к этим методам.

ОБНОВЛЕНИЕ

Мое окончательное решение: я добавил метод "getUser" в EventsModel.Когда пользователь хочет вызвать метод Edit или Delete - я проверяю текущий идентификатор пользователя с идентификатором, записанным в объекте.

Фрагмент EventsModelsController:

        [Authorize]
        public async Task<IActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var eventsModel = await _context.EventsModel.FindAsync(id);
            if (eventsModel.getUser() != HttpContext.User.Identity.Name.ToString())
            {
                return RedirectToAction(nameof(Index));
            }
            if (eventsModel == null)
            {
                return NotFound();
            }
            return View(eventsModel);
        }

1 Ответ

0 голосов
/ 09 апреля 2019

Простой ответ: есть много способов сделать это.Это зависит от того, как вы хотите, чтобы ваш вид выглядел, но если вы просто хотите ограничить маршрут, вы также можете использовать роль для этой аутентификации, например,

[Authorize(Roles = "organisator")]

Middleware.Вы должны иметь возможность просто использовать промежуточное программное обеспечение для аутентификации, добавив используемую политику и обработчик для проверки контекста, чтобы увидеть, является ли пользователь организатором указанного события.Но если ваш проект не позволяет этого, пользовательский может достичь того же эффекта.

 services.AddAuthorization(options =>
        {
            options.AddPolicy("PolicyOrganisator", policy =>...);
        });

... Hanlder

if (context.User.userID == context.Request... ) 
{
    context.Succeed();
}

Вы также можете просто проверить на контроллере, как вы упоминаете в своих вопросах.Добавьте дополнительные данные в вашей модели, чтобы пометить, если этот пользователь может или не может получить.

calss EventsModel {
 ...
 bool canEdit { get => userID == item.organisator; } 
}

Если это единственный маршрут, который вы пытаетесь ограничить, то я не вижу, что не так с добавлением оператора if в верхней части метода, чтобы проверить, следует ли вам перенаправить.Я добавил ссылки внизу страницы, потому что примеры изменят зависимость от того, как вы настроили свой проект.

https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-2.2

https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-2.2

https://docs.microsoft.com/en-us/dotnet/standard/attributes/writing-custom-attributes

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