Asp.net-Core-Mvc

如何在 Asp.net Core MVC(又名 Asp.Net 5 RC1)中檢查響應 cookie?

  • April 27, 2016

我正在將 Web 表單應用程序轉換為 asp.net core mvc。在我的 web 表單應用程序中,有時在我設置了一些響應 cookie 之後,其他程式碼需要查看它們是否已設置,如果是,請訪問 cookie 的屬性(即值、過期、安全、http)。在 webforms 和 MVC 5 中,可以遍歷 cookie 並返回任何特定的 cookie(我知道的老派)

      for(int i = 0; i < cookies.Count; i++) {
           if(cookies[i].Name == cookieName) {
               return cookies[i];
           }
       }

但是asp.net core mvc中訪問響應cookie的界面是這樣的:

響應cookies介面

基於此界面,我看不到一種方法來檢查響應 cookie 是否存在並獲取它的屬性。但是一定有辦法做到嗎?

在一個操作方法中,我嘗試在響應對像上設置兩個 cookie,然後立即嘗試訪問它們。但是智能感知沒有顯示任何允許我訪問它們的方法、屬性或索引器:

在此處輸入圖像描述

有那麼一刻,我想也許我可以使用Response.Cookies.ToString();並解析這些資訊來查找我的 cookie 資訊,但是可惜,該ToString()呼叫返回“Microsoft.AspNet.Http.Internal.ResponseCookies”,因為該對像沒有覆蓋預設實現。

只是為了好玩,我還檢查了 GitHub 的目前 dev 分支,看看界面自 RC1 以來是否發生了變化,但實際上沒有。那麼給定這個介面,我如何檢查響應cookie的存在並獲取它的屬性?我曾想過嘗試通過響應標頭集合進行入侵,但這似乎很蹩腳。

這是我value從響應中獲取 cookie 的方法。如果需要,可以使用這樣的東西來獲取整個 cookie:

string GetCookieValueFromResponse(HttpResponse response, string cookieName)
{
 foreach (var headers in response.Headers.Values)
   foreach (var header in headers)
     if (header.StartsWith($"{cookieName}="))
     {
       var p1 = header.IndexOf('=');
       var p2 = header.IndexOf(';');
       return header.Substring(p1 + 1, p2 - p1 - 1);
     }
 return null;
}

Microsoft.AspNetCore.Http.Extensions在被呼叫中有一個擴展方法可用GetTypedHeaders()。可以呼叫它HttpContext.Response來讀取Set-Cookie標題。例如在中間件中,我們可能想要截取Set-Cookie響應頭並替換它:

 public async Task Invoke(HttpContext httpContext)
       {
           httpContext.Response.OnStarting(state =>
           {
               var context = (HttpContext)state;

               var setCookieHeaders = context.Response.GetTypedHeaders().SetCookie;

               // We assume only one cookie is found. You could loop over multiple matches instead.
               // setCookieHeaders may be null if response doesn't contain set-cookie headers
               var cookie = setCookieHeaders?.FirstOrDefault(x => x.Name == "mycookiename");

               if (cookie == null)
               {
                   return Task.CompletedTask;
               }

               var opts = new CookieOptions
               {
                   HttpOnly = true,
                   Expires = DateTimeOffset.Now.AddHours(12),
                   SameSite = SameSiteMode.Lax,
                   Secure = true
               };

               context.Response.Cookies.Delete(cookie.Name.Value);
               context.Response.Cookies.Append(cookie.Name.Value, "mynewcookievalue", opts);
               
               return Task.CompletedTask;

           }, httpContext);

           await _next(httpContext);
       }

引用自:https://stackoverflow.com/questions/36899875