私の 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 } );
}
およびMyAttribute
class は継承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 が構成されていることは多かれ少なかれ確信しています。UseCookies
System.Web.HttpSessionStateBase.IsCookieless
false
(System.Web.Configuration.SessionStateSection)System.Web.Configuration.WebConfigurationManager.GetSection("system.web/sessionState").Cookieless
UseCookies
RedirectToAction()
エンコードされたセッション状態に似たランダムに見える文字列を突然リダイレクト ターゲットに挿入するのはなぜですか?