O servidor reclama o armazenamento em cache com a autenticação do Owin
Eu tenho um aplicativo que costumava usarFormsAuthentication
, e um tempo atrás eu mudei para usar oIdentityModel
deWindowsIdentityFramework
para que eu pudesse me beneficiar da autenticação baseada em declarações, mas era bem feio usar e implementar. Então agora eu estou olhandoOwinAuthentication
.
Estou olhandoOwinAuthentication
e aAsp.Net Identity
estrutura. Mas oAsp.Net Identity
única implementação do framework no momento usaEntityModel
e estou usandonHibernate
. Então, por enquanto, estou tentando tentar ignorarAsp.Net Identity
e apenas use oOwin Authentication
diretamente. Eu finalmente consegui um login funcional usando as dicas de "Como eu ignoro a mágica do Identity Framework e apenas uso o middleware de autenticação OWIN para obter as declarações que eu procuro?", mas agora meu cookie segurando as reivindicações é bastante grande. Quando eu usei oIdentityModel
Eu era capaz de usar um mecanismo de cache do lado do servidor que armazenava em cache as declarações no servidor e o cookie apenas segurava um token simples para as informações armazenadas em cache. Existe uma característica semelhante emOwinAuthentication
, ou eu teria que implementá-lo sozinho?
Eu espero que eu esteja em um desses barcos ...
O cookie fica como 3KB, oh bem, é um pouco grande.Ativar um recurso semelhante aIdentityModel
SessãoCaching inOwin
que eu não sei.Escreva minha própria implementação para armazenar em cache as informações que fazem com que o cookie inche e veja se consigo conectá-lo quando configuroOwin
na inicialização do aplicativo.Eu estou fazendo tudo errado e há uma abordagem que eu não pensei ou estou abusando de algo emOwin
.
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),
});
}
}
ATUALIZAR Consegui obter o efeito desejado usando as informações fornecidas pelo Hongye e desenvolvi a lógica abaixo ...
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);
}
}