Almacenamiento de notificaciones en el lado del servidor con la autenticación de Owin
Tengo una aplicación que solía usarFormsAuthentication
Y hace un tiempo lo cambié para usar elIdentityModel
desdeWindowsIdentityFramework
de modo que pudiera beneficiarme de la autenticación basada en notificaciones, pero era bastante desagradable de usar e implementar. Así que ahora estoy mirandoOwinAuthentication
.
Estoy mirando aOwinAuthentication
y elAsp.Net Identity
marco de referencia. Pero elAsp.Net Identity
Única implementación del marco en este momento utilizaEntityModel
y estoy usandonHibernate
. Así que por ahora estoy tratando de intentar eludirAsp.Net Identity
y solo usa elOwin Authentication
directamente. Finalmente pude obtener un inicio de sesión de trabajo usando los consejos de "¿Cómo ignoro la magia del Marco de Identidad y solo uso el middleware de autenticación OWIN para obtener los reclamos que busco?", pero ahora mi cookie que contiene los reclamos es bastante grande. Cuando usé elIdentityModel
Pude usar un mecanismo de almacenamiento en caché del lado del servidor que almacenaba las notificaciones en el servidor y la cookie solo contenía un token simple para la información almacenada en la memoria caché. ¿Hay una característica similar enOwinAuthentication
¿O tendría que implementarlo yo mismo?
Supongo que voy a estar en uno de estos barcos ...
La cookie permanece como 3KB, bueno, es un poco grande.Habilitar una característica similar aIdentityModel
SesiónCaching enOwin
que yo no conozcoEscribir mi propia implementación para almacenar en caché la información que hace que la cookie se infle y ver si puedo conectarla cuando configuroOwin
al inicio de la aplicación.Estoy haciendo todo esto mal y hay un enfoque que no he pensado o estoy haciendo un mal uso de algoOwin
.
public class OwinConfiguration
{
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Application",
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true,
CookieName = "Application",
ExpireTimeSpan = TimeSpan.FromMinutes(30),
LoginPath = "/Login",
LogoutPath = "/Logout",
ReturnUrlParameter="ReturnUrl",
SlidingExpiration = true,
Provider = new CookieAuthenticationProvider()
{
OnValidateIdentity = async context =>
{
//handle custom caching here??
}
}
//CookieName = CookieAuthenticationDefaults.CookiePrefix + ExternalAuthentication.ExternalCookieName,
//ExpireTimeSpan = TimeSpan.FromMinutes(5),
});
}
}
ACTUALIZAR Pude obtener el efecto deseado utilizando la información que proporcionó Hongye y se me ocurrió la siguiente lógica ...
Provider = new CookieAuthenticationProvider()
{
OnValidateIdentity = async context =>
{
var userId = context.Identity.GetUserId(); //Just a simple extension method to get the ID using identity.FindFirst(x => x.Type == ClaimTypes.NameIdentifier) and account for possible NULLs
if (userId == null) return;
var cacheKey = "MyApplication_Claim_Roles_" + userId.ToString();
var cachedClaims = System.Web.HttpContext.Current.Cache[cacheKey] as IEnumerable<Claim>;
if (cachedClaims == null)
{
var securityService = DependencyResolver.Current.GetService<ISecurityService>(); //My own service to get the user's roles from the database
cachedClaims = securityService.GetRoles(context.Identity.Name).Select(role => new Claim(ClaimTypes.Role, role.RoleName));
System.Web.HttpContext.Current.Cache[cacheKey] = cachedClaims;
}
context.Identity.AddClaims(cachedClaims);
}
}