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 ()});