tl;博士:在底部;)
想象一下,我有一些带有注释的数据库。为了向用户展示它们,我使用此方法(此处为实体框架):
var allNotes = db.Notes.Where(x => AllowAccess(x.AuthorId, User.GetUserId())).ToList();
AllowAccess() 函数将决定当前用户是否有权查看笔记。“x.AuthorId”是存储笔记所有者ID的变量。
注意: User.GetUserId() 是返回当前用户 id 的方法。我使用 Asp.net identity 3 进行身份验证(所有身份验证代码都是由 Visual Studio 为我生成的)
这是这个函数当前的样子:
public bool AllowAccess(string dbID, string userIdFromController)
{
var userId = User.GetUserId();
if(userId == null && userIdFromController != null)
{
Trace.Write("-----------null userId");
}
else if (userId == null && userIdFromController == null)
{
Trace.Write("-----------null userId ");
}
else
{
Trace.Write("-----------OK userId ");
}
return dbID == User.GetUserId();
}
问题是:“userId”变量有时包含用户 ID,有时不包含。我猜不出为什么会这样。没有规则:它有时只是等于 null。我首先认为这是 asp.net identity 3 的问题,它有时会失败,但不是。
如您所见,我的函数获得了名为“userIdFromController”的第二个参数。它与“userId”几乎相同,但有一个区别:我直接从控制器调用 User.GetUserId() (如您在此问题的第一段代码中所见)。
你知道发生了什么吗?“userIdFromController”始终设置正确,“userId”有时不正确。我在 AllowAccess 函数的所有“if 语句”中设置了断点,并且不时调用第一个断点(第二个从不,第三个最常见)。
TL; DR:所以,总结一下:“userId”和“userIdFromController”是相同的,但是第一个是在AllowAccess函数中创建的,第二个:直接在调用AllowAccess的控制器中。“userIdFromController”总是有效,“userId”有时。为什么会这样?