Мне нужно написать пользовательский файл cookie для клиента после входа пользователя. Этот проект использует Asp.Net Identity 2.0 и шаблон Visual Studio MVC 5 по умолчанию, поэтому он больше не прямой как это было в прошлом.Пишите cookie клиенту после входа в систему
Я думал, что место, чтобы сделать это было бы внутри метода ApplicationUser.GenerateUserIdentityAsync()
, но HttpContext.Current
всегда нуль, когда этот метод выполняется, и я предполагаю, что его из-за его объявлен как асинхронный Task<>
и вызывается из отдельного потока.
Я также попытался создать событие в классе ApplicationUser
, но это не сработает, потому что снова его вызывали из отдельного потока. Я мог бы переписать этот метод синхронно, но мне интересно, как правильно это сделать, используя шаблон, который предоставляет Microsoft.
public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
public ApplicationUser()
{
LastLogin = String.Empty;
HasLoggedInBefore = false;
UserCreated += ApplicationUser_UserCreated;
}
void ApplicationUser_UserCreated(object sender, ApplicationUser user)
{
// write our custom cookie
user.WriteDetailsCookie();
}
public event EventHandler<ApplicationUser> UserCreated;
protected virtual void OnUserCreated(ApplicationUser user)
{
EventHandler<ApplicationUser> handler = UserCreated;
if (handler != null)
{
handler(this, user);
}
}
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
OnUserCreated(this); // fire our event
return userIdentity;
}
public void WriteDetailsCookie()
{
var lastLoginCookie = new HttpCookie("UserDetails");
lastLoginCookie.Values.Add("userName", UserName);
lastLoginCookie.Values.Add("lastLogin", DateTime.UtcNow.ToString("G"));
lastLoginCookie.Expires = DateTime.Now.AddDays(90d);
HttpContext.Current.Response.Cookies.Add(lastLoginCookie);
}
}
Что такое *** SecurityStampValidator ***? и 'OwinContext.GetUserManager'? –
Kiquenet
'aspnet: UseTaskFriendlySynchronizationContext' to *** true *** имеет эффект _performance_? – Kiquenet