O servidor reclama o armazenamento em cache com a autenticação do Owin

Eu tenho um aplicativo que costumava usarFormsAuthentication, e um tempo atrás eu mudei para usar oIdentityModel deWindowsIdentityFramework para que eu pudesse me beneficiar da autenticação baseada em declarações, mas era bem feio usar e implementar. Então agora eu estou olhandoOwinAuthentication.

Estou olhandoOwinAuthentication e aAsp.Net Identity estrutura. Mas oAsp.Net Identity única implementação do framework no momento usaEntityModel e estou usandonHibernate. Então, por enquanto, estou tentando tentar ignorarAsp.Net Identity e apenas use oOwin Authentication diretamente. Eu finalmente consegui um login funcional usando as dicas de "Como eu ignoro a mágica do Identity Framework e apenas uso o middleware de autenticação OWIN para obter as declarações que eu procuro?", mas agora meu cookie segurando as reivindicações é bastante grande. Quando eu usei oIdentityModel Eu era capaz de usar um mecanismo de cache do lado do servidor que armazenava em cache as declarações no servidor e o cookie apenas segurava um token simples para as informações armazenadas em cache. Existe uma característica semelhante emOwinAuthentication, ou eu teria que implementá-lo sozinho?

Eu espero que eu esteja em um desses barcos ...

O cookie fica como 3KB, oh bem, é um pouco grande.Ativar um recurso semelhante aIdentityModelSessãoCaching inOwin que eu não sei.Escreva minha própria implementação para armazenar em cache as informações que fazem com que o cookie inche e veja se consigo conectá-lo quando configuroOwin na inicialização do aplicativo.

Eu estou fazendo tudo errado e há uma abordagem que eu não pensei ou estou abusando de algo emOwin.

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),
        });
    }
}

ATUALIZAR Consegui obter o efeito desejado usando as informações fornecidas pelo Hongye e desenvolvi a lógica abaixo ...

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);
    }
}

questionAnswers(3)

yourAnswerToTheQuestion