Buforowanie roszczeń po stronie serwera przy użyciu uwierzytelniania Owin

Mam aplikację, która wcześniej używałaFormsAuthenticationi jakiś czas temu zmieniłem go, aby używałIdentityModel zWindowsIdentityFramework dzięki czemu mogłem korzystać z uwierzytelniania opartego na oświadczeniach, ale było ono brzydkie w użyciu i implementacji. Więc teraz patrzęOwinAuthentication.

Patrzę naOwinAuthentication iAsp.Net Identity struktura. AleAsp.Net Identity jedyna implementacja frameworka obecnie korzystaEntityModel i używamnHibernate. Więc na razie staram się ominąćAsp.Net Identity i po prostu użyjOwin Authentication bezpośrednio. W końcu udało mi się uzyskać działający login przy użyciu wskazówek z „Jak zignorować magię Identity Framework i po prostu użyć oprogramowania pośredniego OWIN, aby uzyskać roszczenia, których szukam?„, ale teraz mój plik cookie zawierający roszczenia jest dość dużyIdentityModel Udało mi się użyć mechanizmu buforowania po stronie serwera, który buforował roszczenia na serwerze, a plik cookie posiadał prosty token do przechowywania informacji w pamięci podręcznej. Czy istnieje podobna funkcjaOwinAuthentication, czy musiałbym sam go wdrożyć?

Spodziewam się, że będę w jednej z tych łodzi ...

Ciasteczko pozostaje 3 KB, no cóż, jest trochę duże.Włącz funkcję podobną doIdentityModelSessionCaching inOwin o czym nie wiem.Napisz moją własną implementację, aby buforować informacje powodujące rozdęcie pliku cookie i sprawdzić, czy mogę go podłączyć podczas konfigurowaniaOwin przy uruchomieniu aplikacji.

Robię to wszystko źle i jest podejście, o którym nie pomyślałem, albo nadużywam czegoś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),
        });
    }
}

AKTUALIZACJA Udało mi się uzyskać pożądany efekt dzięki informacjom udostępnionym przez Hongye i wymyśliłem poniższą logikę ...

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