Предотвращение неавторизованных зарегистрированных пользователей редактировать / удалять в ядре asp.net - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь запретить неавторизованным вошедшим в систему пользователям просматривать и редактировать записи других клиентов, но, похоже, они не работают.У меня есть ядро ​​asp.net ApplicationUser, привязанное к каждой созданной категории.Я пытаюсь сопоставить идентификатор текущего пользователя и идентификатор приложения, который хранится в базе данных.

Так что, если другой пользователь должен поместить идентификатор категории в URL, который не совпадает с зарегистрированным в настоящее время ApplicationuserID.Если это не соответствует, то перенаправляет на индекс категории.

Я не знаю, что я делаю неправильно.Я пробовал различные варианты и другие предложения онлайн

// GET: Categories/Edit/5
        public async Task<IActionResult> Edit(int? id)
        {
            var currentUser = await _userManager.GetUserAsync(HttpContext.User);

            var Categories = _context.Categories.FirstOrDefault(m => m.ApplicationUserId == currentUser.Id);

            if (id == null)
            {
                return NotFound();
            }
            if (Categories.ApplicationUserId != currentUser.Id)
            {
                return RedirectToAction(nameof(Index));
                //return View(category);
            }
            else
            {
                var category = await _context.Categories.FindAsync(id);
                if (category == null)
                {
                    return NotFound();
                }
                return View(category);
            }
        }

Httpedit

  [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(int id, [Bind("CategoryId,StoreId,ApplicationUserId,CategoryName,Description")] Category category)
        {
            var currentUser = await _userManager.GetUserAsync(HttpContext.User);
            var store = _context.Stores.FirstOrDefault(m => m.ApplicationUserId == currentUser.Id);
            var categories = _context.Categories.FirstOrDefault(m => m.ApplicationUserId == currentUser.Id);

            if (id != category.CategoryId)
            {
                return NotFound();
            }
            if (categories.ApplicationUserId != currentUser.Id)
            {
                return RedirectToAction(nameof(Index));
            }
            else
            {
                if (ModelState.IsValid)
                {
                    try
                    {

                        category.StoreId = store.Id;
                        category.ApplicationUserId = currentUser.Id;
                        _context.Update(category);
                        await _context.SaveChangesAsync();
                    }
                    catch (DbUpdateConcurrencyException)
                    {
                        if (!CategoryExists(category.CategoryId))
                        {
                            return NotFound();
                        }
                        else
                        {
                            throw;
                        }
                    }
                    return RedirectToAction(nameof(Index));
                }
            }
            return View(category);
        }

Спасибо

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Вам просто нужно немного изменить поток (и избежать ненужных вызовов базы данных).

Предупреждение: Я отредактировал это на месте и вообще не проверял!

// GET: Categories/Edit/5
public async Task<IActionResult> Edit(int? id)
{
    // Fail early here, no reason to check the DB if 
    // the user doesn't include the right information
    if (id == null)
    {
        return NotFound();
    }

    var currentUser = await _userManager.GetUserAsync(HttpContext.User);

    // First, look up the category the user is attempting to access
    var category = await _context.Categories.FindAsync(id);

    // Check that the category the user is accessing belongs to them
    if (category.ApplicationUserId != currentUser.Id)
    {        
        return RedirectToAction(nameof(Index));
    }

    return View(category);
}
0 голосов
/ 01 июля 2019

Вы проверяете первую категорию пользователя следующим образом:

var Categories = _context
    .Categories.FirstOrDefault(m => m.ApplicationUserId == currentUser.Id);

Этот код возвращает ложь при такой проверке categories.ApplicationUserId != currentUser.Id, потому что идентификаторы равны. Вы должны изменить свой код следующим образом

var Categories = _context
    .Categories.FirstOrDefault(m => m.CategoryId == id.Value)

После этого изменения categories.ApplicationUserId может отличаться от currentUser.Id

...