zoukankan      html  css  js  c++  java
  • redis + cookies 实现持久登入

    通过登入把用户信息和token加载到redis中去,

    将token和部分用户信息存储在cookie中,

    下次登入时 判断cookie的token在redis中是否存在,

    存在就把用户信息加载出来自动登入。

    public class LoginFormPrincipal : IPrincipal
    {
    private IIdentity _identity;
    
    public LoginFormPrincipal(LoginFormIdentity loginFormIdentity)
    {
    if (loginFormIdentity == null)
    {
    throw new ArgumentNullException("loginFormIdentity");
    }
    _identity = loginFormIdentity;
    }
    
    public IIdentity Identity
    {
    get
    {
    return _identity;
    }
    }
    
    public bool IsInRole(string role)
    {
    throw new Exception("");
    }
    
    public bool SignOut()
    {
    FormsAuthentication.SignOut();
    HttpContext.Current.Session.Abandon();
    return true;
    }
    
    public static void SignIn(string CurrentId, string Token, int expiration)
    {
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, CurrentId, DateTime.Now, DateTime.Now.AddDays(1), true, Token);
    string cookieValue = FormsAuthentication.Encrypt(ticket);
    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue);
    cookie.HttpOnly = true;
    cookie.Secure = FormsAuthentication.RequireSSL;
    cookie.Domain = FormsAuthentication.CookieDomain;
    cookie.Path = FormsAuthentication.FormsCookiePath;
    if (expiration > 0)
    {
    cookie.Expires = DateTime.Now.AddMinutes(expiration);
    }
    HttpContext context = HttpContext.Current;
    if (context == null)
    {
    throw new InvalidOperationException();
    }
    context.Response.Cookies.Remove(cookie.Name);
    context.Response.Cookies.Add(cookie);
    
    
    }
    
    private static FormsAuthenticationTicket TryParseAuthenticationTicket(HttpRequest request)
    {
    if (request == null)
    {
    throw new ArgumentNullException("request");
    }
    HttpCookie cookie = request.Cookies[FormsAuthentication.FormsCookieName];
    if (cookie == null || string.IsNullOrEmpty(cookie.Value))
    {
    return null;
    }
    try
    {
    return FormsAuthentication.Decrypt(cookie.Value);
    }
    catch
    {
    }
    return null;
    }
    
    private static LoginFormPrincipal TryParsePrincipal(HttpRequest request)
    {
    FormsAuthenticationTicket ticket = TryParseAuthenticationTicket(request);
    if (ticket == null)
    {
    return null;
    }
    int UserId = 0;
    if (!int.TryParse(ticket.Name, out UserId))
    {
    return null;
    }
    string Token = ticket.UserData;
    if (string.IsNullOrEmpty(Token))
    {
    return null;
    }
    
    return new LoginFormPrincipal(new LoginFormIdentity(UserId, Token));
    }
    
    public static void TrySetUserInfo(HttpContext context)
    {
    if (context == null)
    {
    throw new ArgumentNullException("context");
    }
    LoginFormPrincipal user = TryParsePrincipal(context.Request);
    if (user != null)
    {
    HttpCookie cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
    cookie.Expires = DateTime.Now.AddMinutes(20);
    context.Response.Cookies.Remove(cookie.Name);
    context.Response.Cookies.Add(cookie);
    context.User = user;
    string key = string.Format(RedisKeys.CurrentUser, user.Identity.Name + user.Identity.AuthenticationType);
    RedisBase.SetListExpire(key, DateTime.Now.AddMinutes(20));
    
    }
    else
    {
    context.User = user;
    HttpCookie cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (cookie != null)
    {
    cookie.Expires = new DateTime(1970, 1, 1);
    context.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
    context.Response.Cookies.Add(cookie);
    }
    
    }
    
    }
    }
    
    public class LoginFormIdentity : IIdentity
    {
    private string _userId;
    private string _token;
    
    public LoginFormIdentity(int UserId, string Token)
    {
    _userId = UserId.ToString();
    _token = Token;
    }
    
    public string AuthenticationType
    {
    get { return _token; }
    }
    
    public bool IsAuthenticated
    {
    get { return true; }
    }
    
    public string Name
    {
    get { return _userId; }
    }
    }
  • 相关阅读:
    STM32 变量无法赋值问题
    ROS 多台计算机联网控制机器人
    Content-Disposition
    Arrays.asList()与toArray()
    length与size()
    computeIfAbsent
    共享锁、排他锁与意向锁
    行锁、页面锁与表锁
    classpath是什么
    start、run、join
  • 原文地址:https://www.cnblogs.com/chongerwangzi/p/7366110.html
Copyright © 2011-2022 走看看