1

私の ASP.NET MVC3 アプリケーションには、次のルート定義があります。

routes.MapRoute( "Sso", "MyController/Sso",
    new { controller = "MyController", action="Sso" } );
routes.MapRoute( "Settings", "MyController/Settings/{objectId}",
    new { controller = "MyController", action="Settings", objectId = @"" } );

そして、MyController私はこれを持っています:

[My]
public ActionResult Sso( list of parameters )
{
    //blah - nothing that would yield a redirect, then
    FormsAuthentication.SetAuthCookie("MagicSso." + someGuid, false);
    return RedirectToAction("Settings", new { objectId = someGuid } );
}

およびMyAttributeclass は継承System.Web.Mvc.ActionFilterAttributeおよびオーバーライドOnResultExecuted()し、後者は の値をログに記録しますResultExecutedContext.HttpContext.Response.RedirectLocation

テストでは問題なく動作し、実行すると、期待どおりにリダイレクトターゲットとしてOnResultExecuted()ログに記録されます。また、適切にマッピングされているため、正しいルートが明らかに一致していることに/MyAccount/Settings/some-guid-as-expected-hereも注意してください。objectId

ただし、本番環境では次のことが起こります。リクエストがhttps://my.domain.name/MyController/Ssoに送信され、実行時にリダイレクト ターゲットOnResultExecuted()などのログが記録されます。/some-very-long-string-290-characters-long-here/MyAccount/Settings/some-guid-as-expected-hereそして、それがユーザーが受け取って従おうとしているようです - HTTPERR ログに、この URL への外界からのリクエストがコード 400 (不正なリクエスト) で失敗していることがわかります。

機密データが明らかになるかどうかわからないため、ここでランダムな文字列を公開したくありません。毎回同じ数の文字が含まれ、常に で始まり(F(、常に で終わり))ます。他のすべての文字は、大文字と小文字のラテン文字と数字で、時折ダッシュとアンダースコアで区切られ、明確な規則はありません。それ以外は完全にランダムに見えます。

多くの検索を行った結果、奇妙に見える文字列は、「Cookie を使用しない」方法でクライアントに送信された ASP.NET セッション状態であると確信しています。だから私は自分のアプリケーションで return と return を確認し、またreturnをSystem.Web.HttpSessionStateBase.CookieMode返します。したがって、クライアントの好みに関係なく、セッション状態を Cookie として返すように ASP.NET が構成されていることは多かれ少なかれ確信しています。UseCookiesSystem.Web.HttpSessionStateBase.IsCookielessfalse(System.Web.Configuration.SessionStateSection)System.Web.Configuration.WebConfigurationManager.GetSection("system.web/sessionState").CookielessUseCookies

RedirectToAction()エンコードされたセッション状態に似たランダムに見える文字列を突然リダイレクト ターゲットに挿入するのはなぜですか?

4

1 に答える 1

0

1 つは fromsystem.web/sessionStateで、もう 1 つは fromで、デフォルトでは異なる値system.web/authentication/forms/cookielessを持っています。後者にはデフォルトで含まれているため、フォーム認証トークンを URL に挿入することがあります。UseDeviceProfile

私たちの場合、この構成は意味がありません。ユーザーが Cookie をサポートしていない場合、Cookie に大きく依存しているためサイトを使用できないため、 に変更system.web/authentication/forms/cookielessするだけUseCookiesです。

于 2013-09-02T10:31:16.347 に答える