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



如果用户试图操纵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);
}

相关内容

  • 没有找到相关文章

最新更新