2017-11-20 12 views
0

私の従来のMVC4アプリケーションでは、フォーム認証が使用されています。次のカスタムFormsAuthenticationTicketを作成しようとすると、Cookieはレスポンスに返されますが、ブラウザで設定されることはありません。私はOpenID Connect id_tokenをクッキーに格納しようとしています。これは、FormsAuthenticationTicketクラスが提供する暗号化に依存しています。まずMVC4 - フォーム認証チケットにカスタムユーザーデータを設定すると、フォーム認証Cookieが設定されません。

//Yes you can decode it - it's just test data 
string idToken = "eyJhbGciOiJSUzI1NiIsImtpZCI6IjA1M2JjYTgzNzZmZjhlNTM5MWVkYzMxYWJkMjU5YzBjIiwidHlwIjoiSldUIn0.eyJuYmYiOjE1MDc1ODExMjcsImV4cCI6MTUwNzU4MTQyNywiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiaW1wbGljaXQiLCJub25jZSI6IjE1MDc1ODExMjA5MDMwMDQ0MDUzNDkzNjk3ODUzMTYiLCJpYXQiOjE1MDc1ODExMjcsImF0X2hhc2giOiJVWm5SeU1pXzVyUEN6NWduYmt5c09BIiwic2lkIjoiOTExYjI1OGQ5OGNiYzRlYzVkYTFiNmFkYzhiMmRjNTUiLCJzdWIiOiIxIiwiYXV0aF90aW1lIjoxNTA3NTgxMTI3LCJpZHAiOiJsb2NhbCIsIm5hbWUiOiJ4Iiwid2Vic2l0ZSI6Imh0dHBzOi8vYWxpY2UuY29tIiwicm9sZSI6ImFkbWluIiwibW9kZWxBY2Nlc3MiOlsiMTIzNCIsIjU2NzgiXSwiY29ubmVjdGlvblN0cmluZyI6InNvbWVNb2RlbENvbm5lY3Rpb25TdHJpbmciLCJhbXIiOlsicHdkIl19.SwTIU1dP1FifCcXVNHkbIGshQiGIjfaa7UAWOrtqKb-FqMMrkvJx_Wa3W19r6NeNwc8mo2go6AFwwu_WM0TF1VJBO1pfmvX35oKgjdTTSqrSmMo5R9_rcywm5YKwVYzmvDqRjPfhZksXkIOuTIk3JOemLrKqw6VIHPyFYV6ZYSK6ZxTpxx50Yz90MmEOBDsTc0GZpQbeZmzyDkBe-iD9uVnlPN2UHz_UuMF__yfmzjGROKLpvem36TKSMa1mEJE7DVxJkexmbxQe3CVwZeIU3iPKloabSReaLCJLqINeI0ikGa4x6PbgfjiP1TPVhIP6i8zUp47lSavGgyy0XVFGtQ"; 

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
          1, 
          model.UserName, 
          DateTime.Now, 
          DateTime.Now.AddDays(30), 
          true, 
          idToken, 
          FormsAuthentication.FormsCookiePath); 
         // Encrypt the ticket. 
string encTicket = FormsAuthentication.Encrypt(ticket); 
this.Response.Cookies.Add(new HttpCookie("TEST", encTicket)); 

私はこの理由が原因の長さかもしれないと思いました。しかし、クッキーの最大長は4096バイトです。 idTokenは983バイトです。

面白いことに、データを小さくする(idTokenを変更して684バイトにする)と、すべて正常に動作します。ここでは実施例である:

//Shortened the idToken (for the sake of the example) 
string idToken = "eyJhbGciOiJSUzI1NiIsImtpZCI6IjA1M2JjYTgzNzZmZjhlNTM5MWVkYzMxYWJkMjU5YzBjIiwidHlwIjoiSldUIn0.eyJuYmYiOjE1MDc1ODExMjcsImV4cCI6MTUwNzU4MTQyNywiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiaW1wbGljaXQiLCJub25jZSI6IjE1MDc1ODExMjA5MDMwMDQ0MDUzNDkzNjk3ODUzMTYiLCJpYXQiOjE1MDc1ODExMjcsImF0X2hhc2giOiJVWm5SeU1pXzVyUEN6NWduYmt5c09BIiwic2lkIjoiOTExYjI1OGQ5OGNiYzRlYzVkYTFiNmFkYzhiMmRjNTUiLCJzdWIiOiIxIiwiYXV0aF90aW1lIjoxNTA3NTgxMTI3LCJpZHAiOiJsb2NhbCIsIm5hbWUiOiJ4Iiwid2Vic2l0ZSI6Imh0dHBzOi8vYWxpY2UuY29tIiwicm9sZSI6ImFkbWluIiwibW9kZWxBY2Nlc3MiOlsiMTIzNCIsIjU2NzgiXSwiY29ubmVjdGlvblN0cmluZyI6InNvbWVNb2RlbENvbm5lY3Rpb25TdHJpbmciLCJhbXIiOlsicHdkIl19.SwTIU1dP1FifCcXVNHkbIGshQiGIjfaa7UAWOrtqKb-"; 

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
          1, 
          model.UserName, 
          DateTime.Now, 
          DateTime.Now.AddDays(30), 
          true, 
          idToken, 
          FormsAuthentication.FormsCookiePath); 
// Encrypt the ticket. 
string encTicket = FormsAuthentication.Encrypt(ticket); 
// Create the cookie. 
this.Response.Cookies.Add(new HttpCookie("TEST", encTicket)); 

次のように私はデータを復号化しています:

HttpCookie cookie = HttpContext.Current.Request.Cookies["TEST"]; 
if (cookie != null) 
{ 
    Debug.WriteLine("Found Cookie Application_PostAuthenticateRequest"); 

    // Get the forms authentication ticket. 
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(cookie.Value); 
    if (authTicket == null) 
    { 
      Debug.WriteLine("auth ticket was null"); 
    } 
    else 
    { 
      Debug.WriteLine("printing auth ticket"); 
      Debug.WriteLine(authTicket.UserData); 
    } 
} 
else 
{ 
    Debug.WriteLine("No Cookie Application_PostAuthenticateRequest"); 
} 

最初の例はうまく上限下にあるクッキーにもかかわらず、動作しないのはなぜ?

答えて

0

の後に問題が発生し、データが大きすぎます。 FormsAuthenticationTicketに入れるデータの量を制限する必要があります。あなたが制限内にあれば、すべてが期待通りに機能します。

関連する問題