Server-Seite behauptet-caching mit Owin-Authentifizierung

Ich habe eine Anwendung, die verwendet werden, um FormsAuthenticationund vor einer Weile schaltete ich es verwenden IdentityModel aus WindowsIdentityFramework so, dass ich davon profitieren könnten, die anspruchsbasierte Authentifizierung, aber es war ziemlich hässlich zu verwenden und zu implementieren. So, jetzt bin ich auf der Suche bei OwinAuthentication.

Ich freu mich auf OwinAuthentication und die Asp.Net Identity Rahmen. Aber die Asp.Net Identity framework, nur die Umsetzung im moment verwendet EntityModel und ich bin mit nHibernate. So jetzt bin ich auf der Suche, um zu versuchen, unter Umgehung Asp.Net Identity und verwenden nur die Owin Authentication direkt. Ich war schließlich in der Lage, eine funktionierende Anmeldung mit den Tipps von "Wie kann ich ignorieren Sie die Identität Framework Magie und benutzen Sie einfach die OWIN auth-middleware, um die Ansprüche, die ich Suche?", aber jetzt ist mein cookie hält die Ansprüche Recht groß ist. Wenn ich IdentityModel ich war in der Lage, einen server-side caching-Mechanismus zwischengespeichert, die Ansprüche auf die server und das cookie hielt nur ein einfaches token für die Cache-Informationen. Gibt es eine ähnliche Funktion in OwinAuthentication oder würde ich haben, um es zu implementieren selbst?

Ich erwarte, dass ich werde in eines der Boote...

  1. Das cookie bleibt als 3KB, oh gut, es ist ein wenig groß.
  2. Aktivieren Sie ein feature wie IdentityModel's SessionCaching in Owin dass weiß ich nicht.
  3. Schreibe meine eigene Implementierung zum Zwischenspeichern von Informationen, wodurch die cookie aufblasen und sehen, ob ich es hook up wenn ich bei der Konfiguration Owin beim Start der Anwendung.
  4. Ich mache diese alle falsch und es ist ein Ansatz, ich habe nicht daran gedacht oder ich bin missbraucht, etwas in 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),
            });
        }
    }

UPDATE
Ich war in der Lage, den gewünschten Effekt mit den Informationen Hongye zur Verfügung gestellt, und ich kam mit der unten-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);
    }
}

InformationsquelleAutor der Frage Nick Albrecht | 2013-10-04

Schreibe einen Kommentar