Almacenamiento de notificaciones en el lado del servidor con la autenticación de Owin

Tengo una aplicación que solía usarFormsAuthenticationY 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 aIdentityModelSesió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);
    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta