0

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」は時々機能します。なぜそれが起こっているのですか?

4

0 に答える 0