Кэширование претензий на стороне сервера с помощью аутентификации Owin

У меня есть приложение, которое использовалосьFormsAuthenticationи некоторое время назад я переключил его, чтобы использоватьIdentityModel изWindowsIdentityFramework так что я мог извлечь выгоду из аутентификации на основе утверждений, но ее использование и реализация были довольно уродливыми. Так что теперь я смотрю наOwinAuthentication.

Я смотрю наOwinAuthentication иAsp.Net Identity фреймворк. НоAsp.Net Identity Единственная реализация фреймворка на данный момент используетEntityModel и я используюnHibernate, Так что сейчас я пытаюсь обойтиAsp.Net Identity и просто использоватьOwin Authentication непосредственно. Я наконец-то смог получить рабочий логин используя советы отКак игнорировать магию Identity Framework и просто использовать промежуточное программное обеспечение для аутентификации OWIN, чтобы получить требуемые требования?", но теперь мое печенье с претензиями довольно велико. Когда я использовалIdentityModel Я смог использовать механизм кэширования на стороне сервера, который кэшировал утверждения на сервере, и cookie просто содержал простой токен для кэшированной информации. Есть ли подобная особенность вOwinAuthentication, или я должен был бы осуществить это сам?

Я ожидаю, что я буду в одной из этих лодок ...

Размер файла cookie составляет 3 КБ, ну, он немного большой.Включить функцию, аналогичнуюIdentityModelSessionCaching вOwin о котором я не знаюНапишите мою собственную реализацию для кеширования информации, вызывающей раздувание куки и посмотреть, смогу ли я подключить его при настройкеOwin при запуске приложения.

Я делаю все это неправильно, и есть подход, о котором я не думал, или я что-то неправильно использую вOwin.

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

ОБНОВИТЬ Я смог получить желаемый эффект, используя информацию, предоставленную Хонге, и придумал следующую логику ...

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

Ответы на вопрос(3)

Ваш ответ на вопрос