Boucles de redirection intermittentes lors de l’authentification ADFS

J’utilise Owin pour configurer mon application ASP.NET MVC 5 (.NET 4.5, IIS 7/8) afin qu’elle s’authentifie auprès d’un programme d’installation ADFS tiers:

app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType); app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType }); app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions { Wtrealm = Settings.Auth.Wtrealm, MetadataAddress = Settings.Auth.MetadataAddress }); 

J’ai également un filtre d’authentification personnalisé (utilisé conjointement avec AuthorizeAtsortingbute ):

 public class OwinAuthenticationAtsortingbute : ActionFilterAtsortingbute, IAuthenticationFilter { public void OnAuthentication(AuthenticationContext filterContext) { var user = filterContext.RequestContext.HttpContext.User; var authenticated = user.Identity.IsAuthenticated; if (!authenticated) { return; } /* Redirect to profile setup if not already complete */ } public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext) { } } 

Cela fonctionne bien la moitié du temps, mais parfois, lors de la connexion initiale, une boucle de redirection se produira entre l’application et la connexion ADFS. Cela semble être spécifique à la session (ne se produit pas pour tous les utilisateurs à la fois) et une fois que la boucle de redirection se produit, elle semble continuer à se produire jusqu’à l’actualisation du pool d’applications.

Lorsque la boucle de redirection se produit, je peux toujours voir (dans l’onglet Réseau de Chrome) ce qui ressemble à un jeton valide émis par ADFS.

J’ai du mal à isoler la cause première mais ce que j’ai constaté est que – lorsque la boucle ne se produit pas, user.Identity est de type ClaimsIdentity et IsAuthenticated est true . Lorsque cela se produit, IsAuthenticated est false mais user.Identity est de type WindowsIdentity .

Toutes les formes d’authentification dans IIS, à l’exception d’Anonyme, sont désactivées. IIS Express n’est utilisé nulle part.

Qu’est-ce qui peut causer cela?

Utilisez-vous des données de session et / ou TempData? Je comprends que cela concerne les cookies. Moi aussi j’ai le même problème.

Voici quelques informations supplémentaires et une explication détaillée de la cause . Le problème peut être contourné en obligeant Owin à utiliser le pipeline de cookies de System.Web (à partir d’ ici ):

 public class SystemWebCookieManager : ICookieManager { public ssortingng GetRequestCookie(IOwinContext context, ssortingng key) { if (context == null) { throw new ArgumentNullException("context"); } var webContext = context.Get(typeof(HttpContextBase).FullName); var cookie = webContext.Request.Cookies[key]; return cookie == null ? null : cookie.Value; } public void AppendResponseCookie(IOwinContext context, ssortingng key, ssortingng value, CookieOptions options) { if (context == null) { throw new ArgumentNullException("context"); } if (options == null) { throw new ArgumentNullException("options"); } var webContext = context.Get(typeof(HttpContextBase).FullName); bool domainHasValue = !ssortingng.IsNullOrEmpty(options.Domain); bool pathHasValue = !ssortingng.IsNullOrEmpty(options.Path); bool expiresHasValue = options.Expires.HasValue; var cookie = new HttpCookie(key, value); if (domainHasValue) { cookie.Domain = options.Domain; } if (pathHasValue) { cookie.Path = options.Path; } if (expiresHasValue) { cookie.Expires = options.Expires.Value; } if (options.Secure) { cookie.Secure = true; } if (options.HttpOnly) { cookie.HttpOnly = true; } webContext.Response.AppendCookie(cookie); } public void DeleteCookie(IOwinContext context, ssortingng key, CookieOptions options) { if (context == null) { throw new ArgumentNullException("context"); } if (options == null) { throw new ArgumentNullException("options"); } AppendResponseCookie( context, key, ssortingng.Empty, new CookieOptions { Path = options.Path, Domain = options.Domain, Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), }); } } 

Et pour le câbler:

 app.UseCookieAuthentication(new CookieAuthenticationOptions { // ... CookieManager = new SystemWebCookieManager() }) 

C’est correct. La création d’un nouveau gestionnaire de cookies, plutôt que l’utilisation d’un gestionnaire existant, a résolu le problème.

app.UseCookieAuthentication (new CookieAuthenticationOptions {AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType, CookieManager = new SystemWebCookieManager ()});