76 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
| using Microsoft.AspNetCore.Builder;
 | |
| using Microsoft.AspNetCore.Http;
 | |
| using Microsoft.Extensions.DependencyInjection;
 | |
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using System.Threading.Tasks;
 | |
| 
 | |
| namespace IRaCIS.Core.IdentityServer4
 | |
| {
 | |
|     public static class CookiesSameSite
 | |
|     {
 | |
|         public static IServiceCollection AddSameSiteCookiePolicy(this IServiceCollection services)
 | |
|         {
 | |
|             services.Configure<CookiePolicyOptions>(options =>
 | |
|             {
 | |
|                 options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
 | |
|                 options.OnAppendCookie = cookieContext =>
 | |
|                     CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
 | |
|                 options.OnDeleteCookie = cookieContext =>
 | |
|                     CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
 | |
|             });
 | |
| 
 | |
|             return services;
 | |
|         }
 | |
| 
 | |
|         private static void CheckSameSite(HttpContext httpContext, CookieOptions options)
 | |
|         {
 | |
|             if (options.SameSite == SameSiteMode.None)
 | |
|             {
 | |
|                 var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
 | |
|                 if (!httpContext.Request.IsHttps || DisallowsSameSiteNone(userAgent))
 | |
|                 {
 | |
|                     // For .NET Core < 3.1 set SameSite = (SameSiteMode)(-1)
 | |
|                     options.SameSite = SameSiteMode.Unspecified;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static bool DisallowsSameSiteNone(string userAgent)
 | |
|         {
 | |
|             // Cover all iOS based browsers here. This includes:
 | |
|             // - Safari on iOS 12 for iPhone, iPod Touch, iPad
 | |
|             // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad
 | |
|             // - Chrome on iOS 12 for iPhone, iPod Touch, iPad
 | |
|             // All of which are broken by SameSite=None, because they use the iOS networking stack
 | |
|             if (userAgent.Contains("CPU iPhone OS 12") || userAgent.Contains("iPad; CPU OS 12"))
 | |
|             {
 | |
|                 return true;
 | |
|             }
 | |
| 
 | |
|             // Cover Mac OS X based browsers that use the Mac OS networking stack. This includes:
 | |
|             // - Safari on Mac OS X.
 | |
|             // This does not include:
 | |
|             // - Chrome on Mac OS X
 | |
|             // Because they do not use the Mac OS networking stack.
 | |
|             if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") &&
 | |
|                 userAgent.Contains("Version/") && userAgent.Contains("Safari"))
 | |
|             {
 | |
|                 return true;
 | |
|             }
 | |
| 
 | |
|             // Cover Chrome 50-69, because some versions are broken by SameSite=None, 
 | |
|             // and none in this range require it.
 | |
|             // Note: this covers some pre-Chromium Edge versions, 
 | |
|             // but pre-Chromium Edge does not require SameSite=None.
 | |
|             if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6"))
 | |
|             {
 | |
|                 return true;
 | |
|             }
 | |
| 
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| }
 |