ASP .NET Core如何使用主键值获取userId值?

问题描述 投票:0回答:1

我需要对一个应用程序进行验证,在该应用程序中,我需要检查文件是否属于发出请求的用户。如果不是,则用户将收到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; }

    }
}
asp.net asp.net-mvc asp.net-core asp.net-mvc-4
1个回答
0
投票

您的选择代码错误。

执行时

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.