Pregunta Compartir las cookies de ASP.NET en subdominios


Tengo dos sitios, ambos en el mismo dominio, pero con diferentes subdominios.
site1.mydomain.com site2.midominio.com

Una vez que estoy autenticado en cada uno, miro las cookies incluidas en la solicitud posterior y son idénticas para cada sitio.

Sin embargo, si inicio sesión en el primer sitio y luego navego hacia el otro, espero que mi cookie del sitio 1 se envíe con la solicitud al sitio2, pero este no es el caso. Aquí están las propiedades de mis cookies.

Iniciando sesión en Site1, esta cookie existe

Name = MySite 
Domain = 
Has Keys = False 
HttpOnly = False 
Path = / 
Value = 1C41854066B03D8CC5679EA92DE1EF427DAC65D1BA0E672899E27C57245C1F0B7E93AB01B5563363AB4815A8F4BDE9D293FD261E03F8E60B8497ABBA964D8D315CCE1C8DD220C7176E21DC361935CF6 
Expires = 1/1/0001 12:00:00 AM 

Al iniciar sesión en Site2, estas cookies existen.

Name = MySite 
Domain = 
Has Keys = False 
HttpOnly = False 
Path = / 
Value =    C8C69F87F993166C4D044D33F21ED96463D5E4EB41E1D986BF508DA0CBD5C2CA7D782F59F3BC96871108997E899FF7401C0D8615705BDB353B56C7E164D2302EE6731F41705016105AD99F4E0578ECD2 
Expires = 1/1/0001 12:00:00 AM 

Establecí el dominio en cada uno (no aparece en una cookie de solicitud ya que solo es necesaria en el cliente). Me he asegurado de que mi configuración de formularios para cada uno sea idéntica Me he asegurado de que la configuración de mi clave del equipo sea la misma en ambas configuraciones web.

No entiendo por qué esto no funciona. ¿Qué contiene una cookie que el cliente le envíe para un subdominio y no para el otro cuando ambos usan las mismas cookies de autenticación hasta donde yo sé?

Comente si hay más información que le gustaría ver. He estado luchando con esto durante dos días. De acuerdo a Este artículo esto debería estar funcionando.

ACTUALIZAR:  código agregado

Aquí está mi configuración de archivo de configuración para mi autenticación. Esto se usa en ambos sitios.

<authentication mode="Forms">
    <forms loginUrl="~/Account/LogOn"
       defaultUrl="~/Home/Index"
       name="MySite" 
       protection="All" 
       path="/" 
       domain="mydomain.com" 
       enableCrossAppRedirects="true" 
       timeout="2880" 
/>

Y aquí está mi código para crear la cookie en Site1.

//Add a cookie that the Site2 will use for Authentication
var cookie = FormsAuthentication.GetAuthCookie(userName, true);
cookie.Name = "MySite";
cookie.HttpOnly = false;
cookie.Expires = DateTime.Now.AddHours(24);
cookie.Domain = "mydomain.com"; 
HttpContext.Response.Cookies.Add(cookie);
HttpContext.Response.Redirect(site2Url,true);

ACTUALIZACIÓN 2:

Noté algo extraño mientras probaba. Cuando agrego una cookie a la respuesta para site1, se agrega a este directorio ...     C: \ Users \ jreddy \ AppData \ Roaming \ Microsoft \ Windows \ Cookies

Cuando agrego una cookie a la respuesta para el sitio, se agrega a este directorio ...     C: \ Users \ jreddy \ AppData \ Roaming \ Microsoft \ Windows \ Cookies \ Low

Ese podría ser mi problema. ¿Podría ser que uno de mis sitios esté incluido en la zona de intranet local?

ACTUALIZACIÓN 3: Problema encontrado, solución desconocida Parece que mi problema tiene que ver con que mi segundo sitio sea parte de la Zona de Intranet Local. Si voy al Sitio 1 usando Firefox, funciona, pero debo ingresar mis credenciales de Windows. Si voy a través de IE, mis credenciales se recogen automáticamente, pero el sitio2 no puede leer las cookies. Puedo preguntar esto en otra pregunta.


28
2017-09-28 21:09


origen


Respuestas:


establecer la propiedad del dominio en ".midominio.com" en cada uno de los sitios web de las cookies de dos subdominios

me gusta

Response.Cookies["test"].Value = "some value";
Response.Cookies["test"].Domain = ".mysite.com";

ACTUALIZACIÓN 1

en el sitio

HttpCookie hc = new HttpCookie("strName", "value");
hc.Domain = ".mydomain.com"; // must start with "."
hc.Expires = DateTime.Now.AddMonths(3);
HttpContext.Current.Response.Cookies.Add(hc);

En el sitio B

HttpContext.Current.Request.Cookies["strName"].Value

Intentalo

Saludos


14
2017-09-29 02:15



Agrega una nueva cookie y especifica un dominio como este

HttpCookie cookie = new HttpCookie("cookiename", "value");
cookie.Domain = "domain.com";

Para autenticación de formularios, establezca esto en web.config

<forms name=".ASPXAUTH" 
       loginUrl="login.aspx" 
       protection="All" 
       timeout="30" 
       path="/" 
       requireSSL="false" 
       domain="domain.com">
</forms>

La cookie estará accesible para todos los subdominios.

Para que cada dominio pueda descifrar la cookie, todos los archivos web.config deben usar el mismo algoritmo y clave de cifrado / descifrado. (cómo crear una clave de máquina)

Ejemplo:

// do not wrap these values like this in the web.config
// only wrapping for code visibility on SO
<machineKey  
  validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75
                 D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281
                 B"             
  decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719
                 F"
  validation="SHA1"
  decryption="AES"
/>

Para implementaciones más sencillas, estos valores se pueden almacenar en un archivo separado:

<machineKey configSource="machinekey.config"/>

Para mayor seguridad, también puede encriptar la clave de la máquina para mayor protección..


9
2017-09-29 05:04



Si está utilizando la autenticación Forms en todos sus subdominios, todo lo que necesita hacer es agregar domain=".mydomain.com" propiedad a la <forms> nodo en su web.config

Tenga en cuenta el período principal en .mydomain.com

Este simple cambio por sí mismo hará que su cookie de autenticación sea válida en todos los subdominios; no es necesario configurar manualmente ninguna cookie.


4
2018-02-08 21:53



Creé un método de extensión HttpContext que escribirá una cookie segura de subdominio.

Publicación de blog y discusión

public static class HttpContextBaseExtenstions
{
    public static void SetSubdomainSafeCookie(this HttpContextBase context, string name, string value)
    {
        var domain = String.Empty;

        if (context.Request.IsLocal)
        {
            var domainSegments = context.Request.Url.Host.Split('.');
            domain = "." + String.Join(".", domainSegments.Skip(1));
        }
        else
        {
            domain = context.Request.Url.Host;
        }

        var cookie = new HttpCookie(name, value)
        {
            Domain = domain
        };

        context.Response.SetCookie(cookie);
    }
}

// usage
public class MyController : Controller
{
    public ActionResult Index()
    {
        this.Context.SetSubdomainSafeCookie("id", Guid.NewGuid().ToString());
        return View();
    }
}

1
2018-02-28 23:41



Preguntas populares