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("用户名:"

  

单点logi,n的更多相关文章

  1. 著名ERP厂商的SSO单点登录解决方案介绍一

          SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户 ...

  2. 看图理解JWT如何用于单点登录

    单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...

  3. 集成基于OAuth协议的单点登陆

    在之前的一篇文章中,我们已经介绍了如何为一个应用添加对CAS协议的支持,进而使得我们的应用可以与所有基于CAS协议的单点登陆服务通讯.但是现在的单点登陆服务实际上并不全是通过实现CAS协议来完成的.例 ...

  4. 集成基于CAS协议的单点登陆

    相信大家对单点登陆(SSO,Single Sign On)这个名词并不感到陌生吧?简单地说,单点登陆允许多个应用使用同一个登陆服务.一旦一个用户登陆了一个支持单点登陆的应用,那么在进入其它使用同一单点 ...

  5. 细说SSO单点登录

    什么是SSO? 如果你已知道,请略过本节! SSO核心意义就一句话:一处登录,处处登录:一处注销,处处注销.即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很多人容易把SS ...

  6. [原创]django+ldap+memcache实现单点登录+统一认证

    前言 由于公司内部的系统越来越多,为了方便用户使用,通过django进行了单点登录和统一认证的尝试,目前实现了django项目的单点登录和非django项目的统一认证,中间波折挺多,涉及的技术包括dj ...

  7. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

  8. CAS FOR WINDOW ACTIVE DIRECTORY SSO单点登录

    一.CAS是什么? CAS(Central Authentication Service)是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(支持 ...

  9. Lind.DDD.SSO单点登陆组件的使用(原创)

    回到目录 一般sso的说明 在Lind.DDD框架里,有对单点登陆的集成,原理就是各个网站去sso网站统一登陆授权,之后在sso网站将登陆的token进行存储,存储方式随你(cache,redis,m ...

随机推荐

  1. MySQL之replace函数应用

    replace函数,从字面上看其主要作用就是替换.实际它的作用确实是替换.那么替换有哪些应用场景呢?比如A表和B表有一个关联的字段就是id,但是在A中id是数字,在B中id也是数字,但是B中id多一个 ...

  2. ppt VBA 实现随机抽题

    目录 目标/最终效果 关于VBA VBA简单示例 检查环境 步骤 VBA实现随机抽题 todo challenge 目标/最终效果 目标是制作一个ppt,实现随机抽题,具体描述: 第一页幻灯片中:点击 ...

  3. java中过滤器(Filter)与拦截器(Interceptor )区别

    过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是设置字符集.控制权限.控制转向.做一些业务逻辑判断等.其工作 ...

  4. IT项目经理都需要具备哪些能力

    发布时间:05-2009:24优质原创作者 项目经理是IT行业中比较常见的职位,工作职责主要包括三个方面,其一是资源整合任务:其二是沟通协调任务:其三是保障项目的时间周期. 资源整合能力是项目经理的重 ...

  5. MLflow系列4:MLflow模型

    英文链接:https://mlflow.org/docs/latest/models.html 本文链接:https://www.cnblogs.com/CheeseZH/p/11946260.htm ...

  6. input file上传文件弹出框的默认格式设置

    我们使用html的input 标签type="flie"时,如何设置默认可选的文件格式 <input id="doc_file" type="f ...

  7. openwrt的shell下如何访问寄存器的内容?

    答:通过devmem工具(在openwrt的make menuconfig中可以使能该工具) $ busybox devmem 0x123456

  8. centos7安装Redis5.0.5

    1.下载redismkdir /home/redis/cd /home/redis/wget http://download.redis.io/releases/redis-5.0.5.tar.gzt ...

  9. Celery-系统守护进程

    1. 使用systemd控制Celery 用法: systemctl {start|stop|restart|status} celery.service 配置文件: /etc/celery/cele ...

  10. linux 系统应用程序桌面图标显示及自启动

    cp test.desktop $RPM_BUILD_ROOT/usr/share/applications/    桌面显示 cp test.desktop $RPM_BUILD_ROOT/etc/ ...