asp.net - page - ssl aspnet core
Compartir las cookies de ASP.NET en subdominios (4)
Tengo dos sitios, ambos en el mismo dominio, pero con diferentes subdominios.
site1.mydomain.com site2.mydomain.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 las teclas de mi máquina 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. Según este artículo, esto debería estar funcionando.
ACTUALIZACIÓN: 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.
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. .
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();
}
}
Si está utilizando la autenticación Forms en todos sus subdominios, todo lo que necesita hacer es agregar la propiedad domain=".mydomain.com"
al nodo <forms>
en su web.config
Tenga en cuenta el período .mydomain.com
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.
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