tl; dr:位于底部;)
想象一下,我有一些带有一些笔记的数据库。要向用户显示它们,我使用此方法(此处为Entity Framework):
var allNotes = db.Notes.Where(x => AllowAccess(x.AuthorId, User.GetUserId())).ToList();
AllowAccess()是决定当前用户是否有权查看笔记的功能。 “x.AuthorId”是存储注释所有者ID的变量。
注意:User.GetUserId()是返回当前用户的id的方法。我使用Asp.net identity 3进行身份验证(所有身份验证代码都是generated by Visual Studio for me)
这是目前的功能:
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身份3的问题,它有时会失败,但没有。
如您所见,我的函数获取了第二个名为“userIdFromController”的参数。它与“userId”几乎相同,但有一点不同:我直接从控制器调用User.GetUserId()(正如您在此问题的第一段代码中所见)。
你知道发生了什么吗? “userIdFromController”始终设置正确,“userId”有时不正确。我在AllowAccess函数中的所有“if语句”中设置了断点,并且不时地调用第一个断点(第二个从不,第三个最常见)。
TL; DR: 所以,总结一下:“userId”和“userIdFromController”是一样的,但第一个是在AllowAccess函数中创建的,第二个是:直接在调用AllowAccess的控制器中创建。 “userIdFromController”总是有效,“userId”。为什么会这样?