单点logi,n

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

namespace DingDangSDK
{
    public class DingdangUserRetriever
    {
        private String token;

        private String publicKey;
        public DingdangUserRetriever(String token, String publicKey)
        {
            this.token = token;
            this.publicKey = publicKey;
        }
        
        public User retrieve(bool verify)
        {
            string result = decode(verify);
            User user = JsonConvert.DeserializeObject<User>(result);
            return user;
        }
        public static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
        public static void Validate(string payloadJson)
        {
           JObject payloadData = (JObject)JsonConvert.DeserializeObject(payloadJson);//解析json
            
            

            var now = DateTime.UtcNow;
            var secondsSinceEpoch = Math.Round((now - UnixEpoch).TotalSeconds);

            // verify exp claim https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.4
            JToken expObj;
            if (payloadData.TryGetValue("exp", out expObj))
            {
                if (expObj == null)
                {
                    //throw new SignatureVerificationException("Claim 'exp' must be a number.");
                    throw new Exception("Claim 'exp' must be a number.");
                }

                double expValue;
                try
                {
                    expValue = Convert.ToDouble(expObj);
                }
                catch
                {
                    //throw new SignatureVerificationException("Claim 'exp' must be a number.");
                    throw new Exception("Claim 'exp' must be a number.");
                }

                if (secondsSinceEpoch >= expValue)
                {
                    //throw new TokenExpiredException("Token has expired.")
                    //{
                    //    Expiration = UnixEpoch.AddSeconds(expValue),
                    //    PayloadData = payloadData
                    //};
                    throw new Exception("Token has expired.");
                }
            }
            
            JToken nbfObj;
            if (payloadData.TryGetValue("nbf", out nbfObj))
            {
                if (nbfObj == null)
                {
                    //throw new SignatureVerificationException("Claim 'nbf' must be a number.");
                    throw new Exception("Claim 'nbf' must be a number.");
                }

                double nbfValue;
                try
                {
                    nbfValue = Convert.ToDouble(nbfObj);
                }
                catch
                {
                    throw new Exception("Claim 'nbf' must be a number.");
                }

                if (secondsSinceEpoch < nbfValue)
                {
                    throw new Exception("Token is not yet valid.");
                }
            }
        }
        /// <summary>
        ///         
        /// </summary>
        /// <returns></returns>
        public string decode(bool verify)
        {
            try
            {
                JObject obj = (JObject)JsonConvert.DeserializeObject(publicKey);
                string[] tokenParts = token.Split('.');
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.ImportParameters(
                  new RSAParameters()
                  {
                      Modulus = FromBase64Url(obj["n"].ToString()),
                      Exponent = FromBase64Url("AQAB")
                  });
                SHA256 sha256 = SHA256.Create();
                byte[] hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(tokenParts[0] + '.' + tokenParts[1]));
                RSAPKCS1SignatureDeformatter rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
                rsaDeformatter.SetHashAlgorithm("SHA256");
                if (rsaDeformatter.VerifySignature(hash, FromBase64Url(tokenParts[2])))
                {
                    string result = Encoding.UTF8.GetString(Base64UrlDecode(tokenParts[1]));
                    if (verify)
                    {
                        Validate(result);
                    }
                    return result;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception)
            {

                throw;
            }

        }



        private static string Base64UrlEncode(byte[] input)
        {
            var output = Convert.ToBase64String(input);
            output = output.Split('=')[0]; // Remove any trailing '='s
            output = output.Replace('+', '-'); // 62nd char of encoding
            output = output.Replace('/', '_'); // 63rd char of encoding
            return output;
        }

        // from JWT spec
        private static byte[] Base64UrlDecode(string input)
        {
            var output = input;
            output = output.Replace('-', '+');
            output = output.Replace('_', '/');
            switch (output.Length % 4)
            {
                case 0: break; // No pad chars in this case
                case 1: output += "==="; break; // Three pad chars
                case 2: output += "=="; break; // Two pad chars
                case 3: output += "="; break; // One pad char
                default: throw new System.Exception("Illegal base64url string!");
            }
            var converted = Convert.FromBase64String(output); // Standard base64 decoder
            return converted;
        }

        static byte[] FromBase64Url(string base64Url)
        {
            string padded = base64Url.Length % 4 == 0
                ? base64Url : base64Url + "====".Substring(base64Url.Length % 4);
            string base64 = padded.Replace("_", "/")
                                  .Replace("-", "+");
            return Convert.FromBase64String(base64);
        }


    }
    public class User
    {
        public String aud { set; get; }

        public String userId { set; get; }

        public String name { set; get; }

        public String email { set; get; }

        public String openId { set; get; }

        public String mobile { set; get; }

        public String exp { set; get; }

        public String jti { set; get; }

        public String iat { set; get; }

        public String nbf { set; get; }

        public String sub { set; get; }

        public override String ToString()
        {
            return "Username{" +
                    "aud='" + aud + '\'' +
                    ", userId='" + userId + '\'' +
                    ", name='" + name + '\'' +
                    ", email='" + email + '\'' +
                    ", openId='" + openId + '\'' +
                    ", mobile='" + mobile + '\'' +
                    ", exp='" + exp + '\'' +
                    ", jti='" + jti + '\'' +
                    ", nbf='" + nbf + '\'' +
                    ", sub='" + sub + '\'' +
                    '}';
        }
    }
}

  

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
namespace AutoUpdate
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            string username;
            File.AppendAllText("g:\\log.txt", args[0]+"\r\n");
            string id_token = args[0].Substring(20);
            //string id_token = "eyJhbGciOiJSUzI1NiIsImtpZCI6IjY1Mzk2NjA3MTQ3ODA5MzY3MzYifQ.eyJlbWFpbCI6IjI2MDI2MyIsIm5hbWUiOiIyNjAyNjMiLCJleHAiOjE1MDY1NjkzMDAsImp0aSI6IjhqakVBRkd0NFo5ZnZNV2JTTWNvVVEiLCJpYXQiOjE1MDY1Njg3MDAsIm5iZiI6MTUwNjU2ODY0MCwic3ViIjoiMjYwMjYzIn0.OwaxyfRiHzgfzsHWHa1I4n5EeTswD1yeh2xHOjWPOt27qXm9Lh2zGLqgfniQU1nZxW7u2FMvESv8oTAq8MFhPX9Jy5LlaU4yfr1HwPS5K_os0oYZpscXqrL4-6OJcQeE0I6AC9ymB5InonDQCQEMuOaijn3VhNpIu4BnJomppcb5IBWJS3VHfJnDxT9JBOf_XRuvS_l1F4BK8nDW7G2QMHMH54-7WarOnFD3DWKexSLNANW_Po458zbI7sYthrft9MnRIk8ctB75ofSUbGjQAjI9b95jYdTKwa9Mu2z3TBNBJXzYe5_WztHgMLfS66IRbEIx0ah2QCZTbK6iTtXEDw";
            string publickey = "{\"kty\":\"RSA\",\"kid\":\"6057314195784354233\",\"alg\":\"ES256\",\"n\":\"n7d5K4m_mtYva7fb8x7AQWPQe95fu1LYkxLFlJQOwV-mC2yibqtEC-Tu2hLlSZYloJfDn9ELsGvOwXOkU8ktcvZvxIvnb1tN2rifDyxQfsNf90tt-IglKukVSGBZqM_EI3DHPh6lqmu3LLSvBPKdTAuo2a88vnASv5HDfyjT-9LhHpB4_2_XmI0O8_5sD-gaxlR7DTJ6tRWg7vKnu6gCC3HgG4MsyZZR5TNapUA9rMTrXNQJThrSdjxIVhcSF_XNYVagpt-01h6DvV2pzdNU06Q3p0172BhzFFCOM1gSRi__St9Rgtp1Ax--GxY9UR543ZIA9kTG7cvEIz82Ibx7Vw\",\"e\":\"AQAB\"}";

            DingDangSDK.DingdangUserRetriever retriever = new DingDangSDK.DingdangUserRetriever(id_token, publickey);
            DingDangSDK.User user = null;

            //2.获取用户信息
            user = retriever.retrieve(false);
            username = user.name;
            MessageBox.Show(username);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            AppSingleton.Run(new login(args));  //防止对应用程序进行多次实际化
        }
    }
}

  

http://10.10.6.18:8023/COA.aspx?id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg0NzE1ODg1MTQ5NjgwNjA2MjYifQ.eyJlbWFpbCI6IndhbnFxIiwibmFtZSI6IndhbnFxIiwiZXhwIjoxNTA4MzE4ODMwLCJqdGkiOiJnNVpSbkllc2tNOEZSSjRvRlRSZm9BIiwiaWF0IjoxNTA4MzE4MjMwLCJuYmYiOjE1MDgzMTgxNzAsInN1YiI6IndhbnFxIn0.I1DLYYXJ_PwcTbCrRM0UpQtqLuXrqy5xJol6kuuyQBNQFh57swJj_htkBSf1iRajxG8Oo0Azhq-yTajnxkmvFxrv29jKfYV4Vvk53FPqz2zC9VMI5FNE9dbfdFyAkFibBo-vNmH96j5I8uz19rwJiC3xFwf-4r5bUUeL9vGdCgfemU9Z9xmbKS7gRpS3A7heyZExzHnQyhab0PEFSzED1v1rWVPUR9Wv99xkIaGRBUiuYchGY4kIhaw5SpHP091tZJGMhDjcJDq__cC6FPM-q2hH_vCxBTFHZ7KyQbdz_P3ay3h6zsWEz8ErAdEsBcH_yqdpZF5arKjNqTMzyrGXFQ

  

   public void Tylogin() {
        string id_token = "";
        string publickey = "{\"kty\":\"RSA\",\"kid\":\"8471588514968060626\",\"alg\":\"ES256\",\"n\":\"4Qa6W-PES5g_STkS2Z4md_XG1UhZUq9JJeMTOC5Yg4RkqULREGj97n6ON-2iWsUl1hlbzzU0n-4l2LZJUrOT0xeaunbo7WOkCiGEwrbpVhvY7fHCi_d4LViJpFZDPIX7h8a_CMjqMSyTesp5SbK7JDzL324g-YsciZV2y8pJeYHgIoauKd6OuOtl5noBOBgz_WrZDkEr6P5TE8_F7TV0CBXWfFSwBSvof7YaVdwOOFFFYrUZVBbqvG5uFreji-V-d2diMgWMaUT3hPBQ7fDY0RE5p5xbqZvYQwgUNVIAmOiHRBB98Mlu-EU-iAHSADYWWp3x6BF0KdojiR34Mb8upw\",\"e\":\"AQAB\"}";
        if (Request.QueryString["id_token"] != null)
        {
            id_token = Request.QueryString["id_token"].ToString();
        }
        //具体类在Contorls对象中,Contorls对象中添加Newtonsoft.json.dll引用
        DdLogin.DingdangUserRetriever c = new DdLogin.DingdangUserRetriever(id_token, publickey);
        DdLogin.User Employeeinfo = null;
        Employeeinfo = c.retrieve(false);

        //去掉登录首页直接登录。具体业务逻辑还的重新做
        string name = Employeeinfo.name;
            Response.Write("用户名:"

  

转载于:https://www.cnblogs.com/xiangxiong/p/7692731.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值