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

Попытка выбросить страницу с ошибкой, если пользователь пытается манипулировать URL-адресом для просмотра колоды, которая ему не принадлежит.

Таким образом, когда карта добавляется в таблицу колод, идентификатор текущего пользователя добавляется к таблице вместе с картой.

Здесь я получаю идентификатор пользователя, а затем сравниваю его с идентификатором свойства userId в колоде.Если текущий идентификатор пользователя не совпадает, я хочу добавить страницу с ошибкой, как показано ниже.

Это не работает.есть идеи?Когда я отлаживаю, он говорит, что item currentUserId и item.UserId имеют одинаковое значение, даже когда я использую URL для перехода к другой колоде, которая им не принадлежит

Мой контроллер:

    public ActionResult Details(int id)
    {
        var currentUserId = User.Identity.GetUserId();

        var deck = _context.Decks.SingleOrDefault(d => d.id == id);

        if (deck == null)
            return HttpNotFound();

        var userDecks = _context.Decks.Where(u => u.UserId == 
         currentUserId);


        foreach (var item in userDecks)
        {
            if (currentUserId != item.UserId)
            {
                return View("Error");
            }
        }

        return View(deck);
    }

Моя модель для справки:

public class Deck
{
    public int id { get; set; }

    public string Name { get; set; }

    public string Notes { get; set; }
    [DisplayName("Card")]
    public virtual List<Card> Card { get; set; }

    public string UserId { get; set;  }
}

1 Ответ

2 голосов
/ 23 сентября 2019

Вы проверяете одно и то же значение дважды, поэтому оно будет одинаковым оба раза.Сначала вы получаете все колоды, соответствующие текущему пользователю:

var userDecks = _context.Decks.Where(u => u.UserId == currentUserId);

Затем вы проверяете, все ли колоды соответствуют текущему пользователю ... соответствуют текущему пользователю:

foreach (var item in userDecks)
{
    if (currentUserId != item.UserId)
    {
        return View("Error");
    }
}

Какие они всегдаwill.

Обратите внимание, что во всей этой логике вы отказались от оригинальной колоды, указанной в данном id:

var deck = _context.Decks.SingleOrDefault(d => d.id == id);

Вместо проверки всех принадлежащих колодтекущим пользователем, вам действительно нужно проверить только указанный.Например:

public ActionResult Details(int id)
{
    var currentUserId = User.Identity.GetUserId();

    var deck = _context.Decks.SingleOrDefault(d => d.id == id);

    if (deck == null)
        return HttpNotFound();

    if (deck.UserId != currentUserId)
        return View("Error");

    return View(deck);
}
...