Estou com um problema estranho ao usar a autenticação de cookies Owin.
Quando inicio a autenticação do servidor IIS, funciona perfeitamente no IE / Firefox e Chrome.
Comecei a fazer alguns testes com autenticação e a fazer login em plataformas diferentes e vi um erro estranho. Esporadicamente, o framework Owin / IIS simplesmente não envia cookies para os navegadores. Vou digitar um nome de usuário e senha corretos, o código é executado, mas nenhum cookie é entregue ao navegador. Se eu reiniciar o servidor, ele começará a funcionar e, em algum momento, tentarei fazer login e novamente os cookies deixarão de ser entregues. Passar o código não faz nada e não gera erros.
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);
}
}
}
});
E dentro do meu procedimento de login, tenho o seguinte código:
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);
Atualização 1: Parece que uma das causas do problema é quando eu adiciono itens à sessão. Os problemas começam. Adicionar algo simples como Session.Content["ABC"]= 123
parece criar o problema.
O que eu consigo entender é o seguinte: 1) (Chrome) Ao fazer login, recebo o ASP.NET_SessionId + meu cookie de autenticação. 2) Vou para uma página que define uma sessão. Conteúdo ... 3) Abra um novo navegador (Firefox) e tente fazer o login e ele não recebe um ASP.NET_SessionId nem recebe um cookie de autenticação 4) Enquanto o primeiro navegador tem o ASP.NET_SessionId, ele continua funcionando. No momento em que removo este cookie, ele tem o mesmo problema que todos os outros navegadores em que estou trabalhando no endereço IP (10.xxx) e no localhost.
Atualização 2: force a criação da ASPNET_SessionId
primeira na minha página login_load antes da autenticação com o OWIN.
1) antes de me autenticar com o OWIN, faço um Session.Content
valor aleatório na minha página de login para iniciar o ASP.NET_SessionId 2) depois autentico e faço mais sessões 3) Outros navegadores parecem funcionar agora
Isso é bizarro. Só posso concluir que isso tem algo a ver com ASP e OWIN pensando que eles estão em domínios diferentes ou algo assim.
Atualização 3 - Comportamento estranho entre os dois.
Comportamento estranho adicional identificado - O tempo limite da sessão Owin e ASP é diferente. O que estou vendo é que minhas sessões Owin permanecem vivas por mais tempo do que minhas sessões ASP através de algum mecanismo. Portanto, ao fazer login: 1.) eu tenho uma sessão de autenticação baseada em cookied 2.) eu defini algumas variáveis de sessão
Minhas variáveis de sessão (2) "morrem" antes da variável de sessão do cookie owin força o login novamente, o que causa comportamento inesperado em todo o aplicativo. (A pessoa está logada, mas não está realmente logada)
Atualização 3B
Após algumas pesquisas, vi alguns comentários em uma página dizendo que o tempo limite da autenticação "forms" e o tempo limite da sessão precisam corresponder. Penso que normalmente os dois estão sincronizados, mas por qualquer motivo os dois não estão sincronizados.
Resumo das soluções alternativas
1) Crie sempre uma sessão antes da autenticação. Basicamente, crie uma sessão ao iniciar o aplicativoSession["Workaround"] = 0;
2) [Experimental] se você persistir com cookies, verifique se o tempo limite / duração do OWIN é maior que o tempo da sua sessão no seu web.config (em teste)