4

管理者以外のユーザーでのみ発生する、非常に奇妙な問題が発生しています。

ユーザーがログインして 1 つのページにアクセスすると、システムからログアウトされます。ログインしたかのようにページの読み込みが終了しますが、他の操作 (ブラウザ ページの更新を含む) を試みると、ログインしていないと見なされ、ログイン プロンプトが表示されます。

フィドラーを開くと、サーバーからの応答の 1 つに次のものが含まれていることがわかります。

応答は 71 バイトの Cookie データを送信しました: Set-Cookie: portalaliasid=; expires=Sat, 08-May-1982 17:26:06 GMT; パス=/; HttpOnly

応答は 69 バイトの Cookie データを送信しました: Set-Cookie: portalroles=; expires=Sat, 08-May-1982 17:26:06 GMT; パス=/; HttpOnly

応答は 69 バイトの Cookie データを送信しました: Set-Cookie: .DOTNETNUKE=; expires=Tue, 12-Oct-1999 04:00:00 GMT; パス=/; HttpOnly

応答は 27 バイトの Cookie データを送信しました: Set-Cookie: language=; パス=/; HttpOnly

応答は 33 バイトの Cookie データを送信しました: Set-Cookie: authentication=; パス=/; HttpOnly

これは、カスタム ashx Web 呼び出しにアクセスすると常に発生するようです。この呼び出しを行うコードは、次の JavaScript です。

$('#lstStates').empty();
var selectedRegions = $('select[id*=lbxRegions]').val();

// Get the list of states for the selected regions
$.ajax({
    url: '/DesktopModules/MyModule/ashx/GetStatesForRegions.ashx',
    data: { regions: selectedRegions },
    dataType: 'json',
    success: function (data) {
        if (IsArray(data)) {
            for (var state in data) {
                $('#lstStates').append('<option>' + data[state] + '</option>');
            }
        }
    }
});

ashxのコードは

public class GetStatesForRegions : IHttpHandler
{
    public bool IsReusable { get { return false; } }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";

        // Get the list of region ids from the GET request
        string[] ids;
        string regionsArray = context.Request["regions[]"] ?? string.Empty;
        ids = regionsArray.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

        using (var dbContext = new MyDataContext())
        {
            string[] states;

            var query = dbContext.Schools.Where(x => x.PodRegionId != null);

            if (ids != null && ids.Length > 0)
                query = query.Where(x => ids.Contains(x.PodRegionId.ToString()));

            states = query.Select(x => x.xosAddress.State)
                          .Distinct()
                          .OrderBy(x => x)
                          .ToArray();

            context.Response.Write(JsonConvert.SerializeObject(states));
            context.Response.End();
        }
    }
}

関連する Cookie が消去され、管理者以外のユーザーがログアウトされるのはなぜですか?


編集:ミステリーに追加するために、非管理者としてashxにアクセスすると、DNNは302 HTTP応答を返し、同じURLに再度リダイレクトするようです。その 302 応答には、Cookie 消去データが含まれています。2回目にashxにアクセスすると(リダイレクトにより)、正しいデータが返されます。

4

1 に答える 1

7

これは、ユーザーが子ポータルでのみ定義されているために発生しますが、ASHX への要求は (DNN の観点から) 親ポータルで発生します。DNN が要求を受け取ると、ユーザーが「ポータルを切り替えた」こと、有効な ID を持っていないことがわかり、認証情報が削除されます。スーパー ユーザーは両方のポータルで有効な ID を持っているため、これは発生しません。

この問題を解決するには、ポータル ID を使用してクエリ文字列パラメーターをリクエストに追加する必要があります。これにより、DNN はリクエストを明確にし、認証をそのまま維持します。

$.ajax({
    url: '/DesktopModules/MyModule/ashx/GetStatesForRegions.ashx?portalId=' + <%:PortalId%>,
    ....
});
于 2012-05-08T19:38:44.640 に答える