У меня есть приложение, которое раньше использовало FormsAuthentication
, и некоторое время назад я переключил его на использование IdentityModel
с WindowsIdentityFramework
, чтобы получить выгоду от аутентификации на основе утверждений, но это было довольно некрасиво в использовании и реализации. Итак, теперь я смотрю на OwinAuthentication
.
Я смотрю на OwinAuthentication
и Asp.Net Identity
фреймворк. Но единственная реализация Asp.Net Identity
фреймворка на данный момент использует EntityModel
, а я использую nHibernate
. Так что пока я хочу попробовать обойти Asp.Net Identity
и просто использовать Owin Authentication
напрямую. Наконец-то я смог получить рабочий логин, используя советы от "Как мне игнорировать магию Identity Framework и просто использовать промежуточное ПО OWIN auth для получения искомых утверждений?", но теперь мой файл cookie содержит претензии довольно большие. Когда я использовал IdentityModel
, я смог использовать механизм кэширования на стороне сервера, который кэшировал утверждения на сервере, а файл cookie просто содержал простой токен для кэшированной информации. Есть ли аналогичная функция в OwinAuthentication
, или мне придется реализовать ее самостоятельно?
Я думаю, что буду в одной из этих лодок ...
- Размер файла cookie составляет 3 КБ, да ладно, он немного великоват.
- Включите функцию, аналогичную
IdentityModel
SessionCaching вOwin
, о которой я не знаю. - Напишите мою собственную реализацию для кеширования информации, вызывающей раздувание cookie, и посмотрите, смогу ли я подключить его, когда я настраиваю
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);
}
}
System.Security.Claims.Claim
? Код для расширенияGetUserId
? - person Kiquenet   schedule 20.05.2016