Кэширование претензий на стороне сервера с помощью аутентификации 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 КБ, ну, он немного большой.Включить функцию, аналогичнуюIdentityModel
SessionCaching в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);
}
}