Buforowanie roszczeń po stronie serwera przy użyciu uwierzytelniania Owin
Mam aplikację, która wcześniej używałaFormsAuthentication
i 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ą doIdentityModel
SessionCaching 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);
}
}