如果用户试图操纵URL来查看不属于他们的甲板,则尝试抛出错误页面。
因此,当一张牌被添加到牌桌上时,当前用户的ID会与牌一起附加到牌桌上。
在这里,我获取用户的 id,然后将其与甲板中 userId 属性的 id 进行比较。如果当前用户的 ID 不匹配,那么我想抛出一个错误页面,如下所示。
这行不通。有什么想法吗? 当我调试时,它说该项目当前用户 ID 和项目。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);
}