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: {}