资讯专栏INFORMATION COLUMN

C#根据用户信息,生成token和cookie的方法

JaysonWang / 1601人阅读

摘要:在前后端分离的项目里,我们请求接口的流程一般是用户使用用户名密码登录信息正确,接口返回请求需要登录验证的接口,将放到里一起请求接口这里介绍一下,在项目里,是怎么生成的项目的引用里,右键管理程序包搜索,安装即可,要注意项目的要大于等于代码如下

在前后端分离的项目里,我们请求接口的流程一般是:

用户使用用户名密码登录

信息正确,接口返回token

请求需要登录验证的接口,将token放到header里一起请求接口

这里介绍一下,在webapi项目里,token是怎么生成的

项目的引用里,右键:管理NuGet程序包

搜索JWT,安装即可,要注意项目的.NetFrameWork 要大于等于4.6

代码如下

public class TokenInfo
{
    public TokenInfo()
    {
        UserName = "jack.chen";
        Pwd = "jack123456";
    }
    public string UserName { get; set; }
    public string Pwd { get; set; }
}

public class TokenHelper
{
    public static string SecretKey = "This is a private key for Server";//这个服务端加密秘钥 属于私钥
    private static JavaScriptSerializer myJson = new JavaScriptSerializer();
    public static string GenToken(TokenInfo M)
    {
        var payload = new Dictionary
            {
                {"UserName", M.UserName},//用于存放当前登录人账户信息
                {"UserPwd", M.Pwd}//用于存放当前登录人登录密码信息
            };
        IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
        IJsonSerializer serializer = new JsonNetSerializer();
        IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
        IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
        return encoder.Encode(payload, SecretKey);
    }

    public static TokenInfo DecodeToken(string token)
    {
        try
        {
            var json = GetTokenJson(token);
            TokenInfo info = myJson.Deserialize(json);
            return info;
        }
        catch (Exception)
        {

            throw;
        }
    }

    public static string GetTokenJson(string token)
    {
        try
        {
            IJsonSerializer serializer = new JsonNetSerializer();
            IDateTimeProvider provider = new UtcDateTimeProvider();
            IJwtValidator validator = new JwtValidator(serializer, provider);
            IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
            IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
            var json = decoder.Decode(token, SecretKey, verify: true);
            return json;
        }
        catch (Exception)
        {
            throw;
        }
    }
}

使用cookie也是一样,用户登录之后,用特定的方法生成cookie,返回到浏览器,浏览器每次请求接口或者访问页面的时候,都会带上cookie信息,用于身份验证
c#生成cookie的方法:

public class UserModel
{
    public string UserName { get; set; }
    public string Pwd { get; set; }
}

public class CookieHelper
{
    private static JavaScriptSerializer myJson = new JavaScriptSerializer();

    /// 
    /// 设置登录信息cookie
    /// 
    /// 
    public static void SetUserCookie(UserModel model)
    {
        FormsAuthentication.SetAuthCookie(model.UserName, false);
        string userStr = myJson.Serialize(model);
        //创建ticket
        FormsAuthenticationTicket ticket = 
            new FormsAuthenticationTicket(1, model.UserName, DateTime.Now, 
            DateTime.Now + FormsAuthentication.Timeout, false, userStr);
        //加密
        var cookieValue = FormsAuthentication.Encrypt(ticket);
        var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue)
        {
            HttpOnly = true,
            Secure = FormsAuthentication.RequireSSL,
            Domain = FormsAuthentication.CookieDomain,
            Path = FormsAuthentication.FormsCookiePath
        };
        //写入cookie
        HttpContext.Current.Response.Cookies.Remove(cookie.Name);
        HttpContext.Current.Response.Cookies.Add(cookie);
    }

    /// 
    /// 获取登录信息的cookie
    /// 
    /// 
    public static UserModel GetUserCookie()
    {
        var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (object.Equals(cookie, null) || string.IsNullOrEmpty(cookie.Value))
        {
            return null;
        }
        try
        {
            var ticket = FormsAuthentication.Decrypt(cookie.Value);
            if (!object.Equals(ticket, null) && !string.IsNullOrEmpty(ticket.UserData))
            {
                UserModel userData = myJson.Deserialize(ticket.UserData);
                return userData;
            }
        }
        catch (Exception)
        {
            
        }
        return null;
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109808.html

相关文章

  • 大话javascript 7期:Cookie、SessionToken那些事儿

    摘要:服务器检查该,以此来辨认用户状态。如果为,表示删除该。防篡改签名服务器为每个项生成签名。服务端根据接收到的内容和签名,校验内容是否被篡改。算法得到的签名和请求中数据的签名不一致,则证明数据被篡改。 一、登录认证机制 随着互联网的不断发展,无论是网站还是app,一般都会要求用户注册/登录。主要的登录方式有账户密码登录、第三方登录(微信登录、QQ登录、微博登录等) 登录可分为三个阶段(登录...

    tianren124 评论0 收藏0
  • zanePerfor中一套简单通用Node前后端Token登录机制github授权登录方式

    摘要:的优势使用简单,性能足够强悍,储存空间无限制,多台服务器可以使用统一的登录态,登录逻辑代码的解耦。每次登录时清除上一次用户的登录信息,即清除登录校验信息,这样就能保证同一用户同一时间只能在一个地方登录。 HI!,你好,我是zane,zanePerfor是一款我开发的一个前端性能监控平台,现在支持web浏览器端和微信小程序端。 我定义为一款完整,高性能,高可用的前端性能监控系统,这是未来...

    0x584a 评论0 收藏0
  • 你真了解 Cookie Session 吗

    摘要:浏览器的同源策略把跨域请求都禁止了,但是页面中的标签是例外,不受同源策略限制。的理念就是,与服务端约定好一个回调函数名,服务端接收到请求后,将返回一段,在这段代码中调用了约定好的回调函数,并且将数据作为参数进行传递。我在做面试官的时候,曾经问过很多朋友这个问题: Cookie 和 Session 有什么区别呢?大部分的面试者应该都可以说上一两句,比如:什么是 Cookie?什么是 Sessi...

    lijy91 评论0 收藏0
  • web认证机制

    摘要:最近读了几篇大牛的博客才对认证机制方面有了进一步了解。尽管在服务器端可以优雅地使用技术如拦截器或动态代理对所有进行前置的登录验证。认证方式比较支持问题和其实是紧密相联的。第三方授权问题采用传统认证方式,若要访问业务,一定要先登录。 引言 以前对认证这方面的认识一直不太深刻,不清楚为什么需要token这种认证,为什么不简单使用session存储用户登录信息等。最近读了几篇大牛的博客才对认...

    fai1017 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<