3

Microsoft HealthVault への認証を処理するモジュールを作成しました。BeginRequest イベント ハンドラーで authToken をチェックしており、それを受け取ったら、後でコントローラーで使用するためにユーザーの情報を保持する新しい Cookie を作成しています。

Cookie を失っていますが、間違った場所を探している可能性があります。

イベント ハンドラーは HttpApplication を唯一のパラメーターとして受け取るため、Cookie を application.Response.Cookies コレクションに追加します。問題は次のとおりです。この HttpApplication のインスタンスはシングルトンですか? System.Web.HttpContext.Current.ApplicationInstance と同じですか?

ただし、ライフサイクルのこの時点で設定された Cookie は、後で消去される可能性があります。それは私が間違っていることですか?

どんな助けでも大歓迎です。

アップデート

質問をしてから、いくつかのことを変更しました。現在、HttpModule で PreRequestEventHandler を処理しています。概念的には何も変わっていませんが、HealthVault の WebApplicationUtilities オブジェクトに Cookie の作成と保存を任せています。Cookie の作成や、作成後の最初の読み取りに問題はありません。

HttpModule イベント ハンドラーでの Cookie 作成コードは次のとおりです。

static void PreRequestHandlerExecute(Object sender, EventArgs e)
{
    HttpContext ctx = System.Web.HttpContext.Current;
        string authToken = ctx.Request.Params["wctoken"];
        if (!String.IsNullOrEmpty(authToken))
        {
            personInfo = WebApplicationUtilities.GetPersonInfo(authToken);
            WebApplicationUtilities.SavePersonInfoToCookie(ctx, personInfo);

            NameValueCollection query = HttpUtility.ParseQueryString(ctx.Request.Url.Query);
            query.Remove("wctoken");
            query.Remove("suggestedtokenttl");

            UriBuilder newUrl = new UriBuilder(ctx.Request.Url);
            newUrl.Query = query.ToString();
            //app.Response.Redirect(newUrl.Uri.OriginalString);
        }
}

リダイレクトがコメント化されていることに注意してください。最初のリクエスト (認証後) で Cookie が作成され、デフォルトのアクションで LoadPersonInfoFromCookie() を使用して読み取ることができます。リダイレクトを行うと、Cookie がクライアントに送信されないことがわかりました。

また、後続のリクエストでは Cookie が Request.Cookies コレクションに存在しないことに気付きました。そのため、LoadPersonInfoFromCookie() を実行すると null になります。奇妙なことに、Response オブジェクトに Cookie が表示されますが、中身は空です。

アクションコードは次のとおりです...

public HttpContext Context
{
    get { return System.Web.HttpContext.Current; }
}

public ActionResult Dashboard()
    {
        try
        {
            HealthVaultAccountModel model = new HealthVaultAccountModel();
            PersonInfo personInfo = WebApplicationUtilities.LoadPersonInfoFromCookie(Context);
            if (personInfo != null)
                model.PersonName = personInfo.Name;
            return View(model);
        }
        catch (Exception ex)
        {
            return RedirectToAction("Index", "Error");
        }
    }

アップデート

イミディエイト ウィンドウの Cookie は次のとおりです。Expires のタイムアウトを 30 日間延長しました。

作成直後のデフォルトアクションで

Context.Request.Cookies["_wcpage"]
{System.Web.HttpCookie}
    Domain: null
    Expires: {8/13/2012 5:24:02 PM}
    HasKeys: true
    HttpOnly: true
    Name: "_wcpage"
    Path: "/"
    Secure: true
    Shareable: false
    Value: "p=1:1234-pVTbctowEP0V..."
    Values: {p=1%3a1234-pVTbctowEP0V...}

次のリクエストのアクションで

Context.Request.Cookies["_wcpage"]
null

興味深いことに、Cookie は応答オブジェクトで定義されていますが、値がなくなり、有効期限がリセットされます。

Context.Response.Cookies["_wcpage"]
{System.Web.HttpCookie}
    Domain: null
    Expires: {1/1/0001 12:00:00 AM}
    HasKeys: false
    HttpOnly: false
    Name: "_wcpage"
    Path: "/"
    Secure: false
    Shareable: false
    Value: ""
    Values: {}
4

1 に答える 1

1

クッキーをどのように作成/取得していますか?クラスのSavePersonInfoToCookieand LoadPersonInfoFromCookieメソッドWebApplicationUtilitiesがそれを行います。

BeginRequest:

// given an authToken from the querystring/post values
var personInfo = WebApplicationUtilities.GetPersonInfo(authToken);
WebApplicationUtilities.SavePersonInfoToCookie(application.Context, personInfo);

コントローラ:

var personInfo = WebApplicationUtilities.LoadPersonInfoFromCookie(HttpContext);
于 2012-07-12T22:14:16.650 に答える