J'ai un problème étrange avec l'utilisation de l'authentification par cookie Owin.
Lorsque je démarre mon authentification de serveur IIS fonctionne parfaitement bien sur IE / Firefox et Chrome.
J'ai commencé à faire des tests avec l'authentification et à me connecter sur différentes plates-formes et j'ai rencontré une erreur étrange. Sporadiquement, le framework Owin / IIS n'envoie tout simplement aucun cookie aux navigateurs. Je vais taper un nom d'utilisateur et un mot de passe qui sont corrects, le code s'exécute mais aucun cookie n'est livré au navigateur du tout. Si je redémarre le serveur, il commence à fonctionner, à un moment donné, j'essaierai de me connecter et à nouveau les cookies cesseront d'être livrés. Parcourir le code ne fait rien et ne génère aucune erreur.
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true,
AuthenticationType = "ABC",
LoginPath = new PathString("/Account/Login"),
CookiePath = "/",
CookieName = "ABC",
Provider = new CookieAuthenticationProvider
{
OnApplyRedirect = ctx =>
{
if (!IsAjaxRequest(ctx.Request))
{
ctx.Response.Redirect(ctx.RedirectUri);
}
}
}
});
Et dans ma procédure de connexion, j'ai le code suivant:
IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var authentication = HttpContext.Current.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("ABC");
identity.AddClaim(new Claim(ClaimTypes.Name, user.Username));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.User_ID.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Role, role.myRole.ToString()));
authentication.AuthenticationResponseGrant =
new AuthenticationResponseGrant(identity, new AuthenticationProperties()
{
IsPersistent = isPersistent
});
authenticationManager.SignIn(new AuthenticationProperties() {IsPersistent = isPersistent}, identity);
Mise à jour 1: Il semble qu'une des causes du problème soit lorsque j'ajoute des éléments à la session, les problèmes commencent. L'ajout de quelque chose de simple comme Session.Content["ABC"]= 123
semble créer le problème.
Ce que je peux faire est le suivant: 1) (Chrome) Lorsque je me connecte, j'obtiens ASP.NET_SessionId + mon cookie d'authentification. 2) Je vais sur une page qui définit une session.contenu ... 3) Ouvrez un nouveau navigateur (Firefox) et essayez de vous connecter et il ne reçoit pas d'ASP.NET_SessionId ni de cookie d'authentification 4) Alors que le premier navigateur a le ASP.NET_SessionId il continue de fonctionner. La minute où je supprime ce cookie, il a le même problème que tous les autres navigateurs sur lesquels je travaille sur IP address (10.xxx) et localhost.
Mise à jour 2: Forcer la création du ASPNET_SessionId
premier sur ma page login_load avant l'authentification avec OWIN.
1) avant de m'authentifier avec OWIN, je crée une Session.Content
valeur aléatoire sur ma page de connexion pour démarrer ASP.NET_SessionId 2) puis je m'authentifie et je fais d'autres sessions 3) D'autres navigateurs semblent maintenant fonctionner
C'est bizarre. Je ne peux que conclure que cela a quelque chose à voir avec ASP et OWIN pensant qu'ils sont dans des domaines différents ou quelque chose du genre.
Mise à jour 3 - Comportement étrange entre les deux.
Comportement étrange supplémentaire identifié - Le délai d'expiration de la session Owin et ASP est différent. Ce que je vois, c'est que mes sessions Owin restent actives plus longtemps que mes sessions ASP grâce à un mécanisme. Donc lors de la connexion: 1.) J'ai une session d'authentification basée sur cookied 2.) J'ai défini quelques variables de session
Mes variables de session (2) "meurent" avant que la variable de session du cookie owin force la reconnexion, ce qui provoque un comportement inattendu dans toute mon application. (La personne est connectée mais n'est pas vraiment connectée)
Mise à jour 3B
Après quelques recherches, j'ai vu quelques commentaires sur une page indiquant que le délai d'expiration de l'authentification des «formulaires» et celui de la session doivent correspondre. Je pense que normalement les deux sont synchronisés mais pour une raison quelconque, les deux ne sont pas synchronisés.
Résumé des solutions de contournement
1) Créez toujours une session avant l'authentification. En gros, créez une session lorsque vous démarrez l'applicationSession["Workaround"] = 0;
2) [Expérimental] si vous persistez les cookies, assurez-vous que votre délai d'expiration / durée OWIN est plus long que votre sessionTimeout dans votre web.config (en test)