阻止用户查看 table 中未分配给其用户 ID 的项目

Stop user from viewing items from table not allocated to their userId

如果用户试图操纵 url 查看不属于他们的牌组,则尝试抛出错误页面。

因此,当将卡片添加到卡片组 table 时,当前用户的 ID 将与卡片一起附加到 table。

我在这里获取用户的 ID,然后将其与卡片组中用户 ID 属性 的 ID 进行比较。如果当前用户的 ID 不匹配,那么我想抛出一个错误页面,如下所示。

这行不通。有任何想法吗?当我调试时它说项目 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;  }
}

您两次检查相同的值,因此两次都相同。首先你得到与当前用户匹配的所有牌组:

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

然后检查是否所有与当前用户匹配的牌组...与当前用户匹配:

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

他们总是会的。

请注意,在所有这些逻辑中,您已经放弃了给定 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);
}