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 ID 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 ID 3の問題だと思っていましたが、失敗することもありますが、そうではありません。
ご覧のとおり、私の関数は「userIdFromController」という 2 番目のパラメーターを取得します。「userId」とほぼ同じですが、1 つの違いがあります。コントローラーから直接 User.GetUserId() を呼び出します (この質問の最初のコードでわかるように)。
何が起こっているか知っていますか?「userIdFromController」は常に正しく設定されますが、「userId」は正しく設定されないことがあります。AllowAccess 関数のすべての「if ステートメント」内にブレークポイントを設定し、最初のステートメントが呼び出されることがあります (2 番目は決して、3 番目は最も頻繁に)。
TL;DR: 要約すると、「userId」と「userIdFromController」は同じですが、最初のものは AllowAccess 関数で作成され、2 つ目は、AllowAccess を呼び出すコントローラーで直接作成されます。「userIdFromController」は常に機能し、「userId」は時々機能します。なぜそれが起こっているのですか?