C# 阻止用户查看未分配给其用户ID的表中的项目
如果用户试图操纵url以查看不属于他们的数据组,则尝试抛出错误页面 因此,当一张卡被添加到数据组表中时,当前用户的id将与该卡一起附加到该表中 在这里,我得到了user的id,然后将其与deck中userId属性的id进行比较。如果当前用户的ID不匹配,那么我想抛出一个错误页面,如下所示 这不管用。有什么想法吗?当我调试时,它说item currentUserId和item.UserId具有相同的值,即使我使用url移动到不属于它们的另一组 我的控制器:C# 阻止用户查看未分配给其用户ID的表中的项目,c#,.net,asp.net-identity,entity,C#,.net,Asp.net Identity,Entity,如果用户试图操纵url以查看不属于他们的数据组,则尝试抛出错误页面 因此,当一张卡被添加到数据组表中时,当前用户的id将与该卡一起附加到该表中 在这里,我得到了user的id,然后将其与deck中userId属性的id进行比较。如果当前用户的ID不匹配,那么我想抛出一个错误页面,如下所示 这不管用。有什么想法吗?当我调试时,它说item currentUserId和item.UserId具有相同的值,即使我使用url移动到不属于它们的另一组 我的控制器: public ActionRes
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; }
}
公共类甲板
{
公共int id{get;set;}
公共字符串名称{get;set;}
公共字符串注释{get;set;}
[显示名称(“卡片”)]
公共虚拟列表卡{get;set;}
公共字符串用户标识{get;set;}
}
您要检查两次相同的值,所以两次都是相同的。首先,您将获得与当前用户匹配的所有组:
var userDecks = _context.Decks.Where(u => u.UserId == currentUserId);
foreach (var item in userDecks)
{
if (currentUserId != item.UserId)
{
return View("Error");
}
}
然后检查是否所有与当前用户匹配的数据组。。。匹配当前用户:
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);
}
你要检查两次相同的值,所以两次都是相同的。首先,您将获得与当前用户匹配的所有组:
var userDecks = _context.Decks.Where(u => u.UserId == currentUserId);
foreach (var item in userDecks)
{
if (currentUserId != item.UserId)
{
return View("Error");
}
}
然后检查是否所有与当前用户匹配的数据组。。。匹配当前用户:
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);
}
这里是“var userDecks=_context.Decks.Where(u=>u.UserId==currentUserId);”你是说这个用户给我所有的Decks,而在你的foreach中是检查同一个用户。这里是“var userDecks=_context.Decks.Where(u=>u.UserId==currentUserId);”你是说这个用户给我所有的Decks,在您的foreach中,检查的是同一个用户。