我需要对一个应用程序进行验证,在该应用程序中,我需要检查文件是否属于发出请求的用户。如果不是,则用户将收到NotFound响应。
我正在尝试使用主键值获取拥有该文件的userId的字符串值,并将其与发出请求的userId的值进行比较。
问题在于,甚至拥有该文件的用户也会收到NotFound响应。
我认为我没有正确获取user2字符串的值。我该如何解决?
[HttpGet("{id}")]
public ActionResult<File> GetShare(int id)
{
string userId = User.Claims.First(c => c.Type == "UserID").Value;
string user2 = _context.File.Where(t => t.FileId == id).Select(t => new File()
{
UserId = t.UserId
}).ToString();
if (userId != user2)
{
return NotFound();
}
else
{
return _context.File.SingleOrDefault(t => t.FileId == id);
}
}
数据库表是基于此模型制作的:
public class File
{
[Key]
public int FileId { get; set; }
[Column(TypeName = "varchar(30)")]
[Required]
[MinLength(1)]
public string Name { get; set; }
[Column(TypeName = "varchar(50)")]
public string Description { get; set; }
[Column(TypeName = "varchar(50)")]
public string Syntax { get; set; }
[Column(TypeName = "smalldatetime")]
public DateTime LastModified { get; set; }
[Column(TypeName = "smalldatetime")]
public DateTime? ExpirationDate { get; set; }
[Column(TypeName = "varchar(MAX)")]
[Required]
[MinLength(1)]
public string Content { get; set; }
[Column(TypeName = "varchar(MAX)")]
public string Tags { get; set; }
public string UserId { get; set; }
[ForeignKey("UserId")]
public virtual UserAccount UserAccount { get; set; }
}
}
您的选择代码错误。
执行时
string user2 = _context.File.Where(t => t.FileId == id).Select(t => new File()
{
UserId = t.UserId
}).ToString();
您基本上是在返回一个IQueriable并在其上返回一个意外结果的字符串上调用ToString()
,并且该字符串与用户ID距离很近。
一个可能的解决方案是
[HttpGet("{id}")]
public ActionResult<File> GetShare(int id)
{
string userId = User.Claims.First(c => c.Type == "UserID").Value;
var file = _context.File.FirstOrDefault(t => t.FileId == id);
if(file == null)
{
return NotFound();
}
if (userId != file.UserId)
{
return NotFound();
}
return file;
}