Tengo un proyecto ASP.NET MVC. Tengo varios sitios web como instancias de ese proyecto trabajando en el mismo servidor, p. en 8000 y 8001 puertos. Cuando autorizo en 8000, si he sido autorizado en 8001, me desconecto automáticamente en el sitio 8001, y viceversa. ¿Cuál es el problema? ¿Se trata de cookies? ¿Cuáles son las formas posibles de resolverlo?

0
Aluminium 31 mar. 2017 a las 21:35

2 respuestas

La mejor respuesta

Puede especificar para cada sitio web un nombre de cookie personalizado colocando en su web.config:

<authtentication model="Forms">
    <forms name="Cookie_8000" loginUrl="urlhere" />
</authentication>

ASP.NET MVC está utilizando de forma predeterminada cookies para almacenar información sobre el usuario firmado. Cuando los sitios web están en producción, no debería ser un problema a menos que se ejecuten en el mismo dominio

Sin embargo, en el espacio de trabajo de desarrollo, simplemente puede especificar el nombre de la cookie como dije anteriormente. Es incluso una mejor solución para configurar esa cookie en su clase Startup.Auth.cs.

Aquí está la configuración predeterminada cuando crea un nuevo proyecto:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
}); 

Puede especificar aquí cómo funciona la cookie y cómo debe ser:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    },
    CookieName = "website1.cookie" // Specify the cookie name
}); 
1
Cristian Szpisjak 1 abr. 2017 a las 07:28

El problema parece que esos sitios comparten el nombre de dominio principal. Como resultado, también pueden compartir cookies de autenticación.

Por ejemplo, http://site1.example.com y http://site2.example.com

Puede realizar una de las siguientes acciones para no compartir cookies entre subdominios.

Opción 1

Especifique diferentes claves de máquina para cada sitio en su web.config

<system.web>
  <machineKey decryptionKey="..." validationKey="..." />
</system.web>

Opción 2

Especifique el nombre de dominio completo en web.config la etiqueta de formulario

<authentication mode="Forms">
   <forms loginUrl="~/Account/Login" timeout="2880" domain="site1.example.com" />
 </authentication>
0
Win 31 mar. 2017 a las 19:09