一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - ASP.NET實現QQ、微信、新浪微博OAuth2.0授權登錄

ASP.NET實現QQ、微信、新浪微博OAuth2.0授權登錄

2020-01-02 13:39yourber ASP.NET教程

本文主要介紹了QQ、微信、新浪微博OAuth2.0授權登錄的示例,主要就是GET、POST遠程接口,返回相應的數據,這里列出相關的代碼,供大家參考。

不管是騰訊還是新浪,查看他們的API,PHP都是有完整的接口,但對C#支持似乎都不是那么完善,都沒有,騰訊是完全沒有,新浪是提供第三方的,而且后期還不一定升級,NND,用第三方的動輒就一個類庫,各種配置還必須按照他們約定的寫,煩而且亂,索性自己寫,后期的擴展也容易,看過接口后,開始以為很難,參考了幾個源碼之后發現也不是那么難,無非是GET或POST請求他們的接口獲取返回值之類的,話不多說,這里只提供幾個代碼共參考,拋磚引玉了。。。

我這個寫法的特點是,用到了Session,使用對象實例化之后調用 Login() 跳轉到登錄頁面,在回調頁面調用Callback() 執行之后,可以從Session也可以寫獨立的函數(如:GetOpenID())中獲取access_token或用戶的唯一標識,以方便做下一步的操作。所謂綁定就是把用戶的唯一標識取出,插入數據庫,和帳號綁定起來。

1.首先是所有OAuth類的基類,放一些需要公用的方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
public abstract class BaseOAuth
{
  public HttpRequest Request = HttpContext.Current.Request;
  public HttpResponse Response = HttpContext.Current.Response;
  public HttpSessionState Session = HttpContext.Current.Session;
 
  public abstract void Login();
  public abstract string Callback();
 
  #region 內部使用函數
 
  /// <summary>
  /// 生成唯一隨機串防CSRF攻擊
  /// </summary>
  /// <returns></returns>
  protected string GetStateCode()
  {
    Random rand = new Random();
    string data = DateTime.Now.ToString("yyyyMMddHHmmssffff") + rand.Next(1, 0xf423f).ToString();
 
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
 
    byte[] md5byte = md5.ComputeHash(UTF8Encoding.Default.GetBytes(data));
 
    return BitConverter.ToString(md5byte).Replace("-", "");
 
  }
 
  /// <summary>
  /// GET請求
  /// </summary>
  /// <param name="url"></param>
  /// <returns></returns>
  protected string GetRequest(string url)
  {
    HttpWebRequest httpWebRequest = System.Net.WebRequest.Create(url) as HttpWebRequest;
    httpWebRequest.Method = "GET";
    httpWebRequest.ServicePoint.Expect100Continue = false;
 
    StreamReader responseReader = null;
    string responseData;
    try
    {
      responseReader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream());
      responseData = responseReader.ReadToEnd();
    }
    finally
    {
      httpWebRequest.GetResponse().GetResponseStream().Close();
      responseReader.Close();
    }
 
    return responseData;
  }
 
  /// <summary>
  /// POST請求
  /// </summary>
  /// <param name="url"></param>
  /// <param name="postData"></param>
  /// <returns></returns>
  protected string PostRequest(string url, string postData)
  {
    HttpWebRequest httpWebRequest = System.Net.WebRequest.Create(url) as HttpWebRequest;
    httpWebRequest.Method = "POST";
    httpWebRequest.ServicePoint.Expect100Continue = false;
    httpWebRequest.ContentType = "application/x-www-form-urlencoded";
 
    //寫入POST參數
    StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream());
    try
    {
      requestWriter.Write(postData);
    }
    finally
    {
      requestWriter.Close();
    }
 
    //讀取請求后的結果
    StreamReader responseReader = null;
    string responseData;
    try
    {
      responseReader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream());
      responseData = responseReader.ReadToEnd();
    }
    finally
    {
      httpWebRequest.GetResponse().GetResponseStream().Close();
      responseReader.Close();
    }
 
    return responseData;
  }
 
  /// <summary>
  /// 解析JSON
  /// </summary>
  /// <param name="strJson"></param>
  /// <returns></returns>
  protected NameValueCollection ParseJson(string strJson)
  {
    NameValueCollection mc = new NameValueCollection();
    Regex regex = new Regex(@"(\s*\""?([^""]*)\""?\s*\:\s*\""?([^""]*)\""?\,?)");
    strJson = strJson.Trim();
    if (strJson.StartsWith("{"))
    {
      strJson = strJson.Substring(1, strJson.Length - 2);
    }
 
    foreach (Match m in regex.Matches(strJson))
    {
      mc.Add(m.Groups[2].Value, m.Groups[3].Value);
    }
    return mc;
  }
 
  /// <summary>
  /// 解析URL
  /// </summary>
  /// <param name="strParams"></param>
  /// <returns></returns>
  protected NameValueCollection ParseUrlParameters(string strParams)
  {
    NameValueCollection nc = new NameValueCollection();
    foreach (string p in strParams.Split('&'))
    {
      string[] ps = p.Split('=');
      nc.Add(ps[0], ps[1]);
    }
    return nc;
  }
 
  #endregion
 
}

2.QQ的OAuth類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
public class QQOAuth : BaseOAuth
{
  public string AppId = ConfigurationManager.AppSettings["OAuth_QQ_AppId"];
  public string AppKey = ConfigurationManager.AppSettings["OAuth_QQ_AppKey"];
  public string RedirectUrl = ConfigurationManager.AppSettings["OAuth_QQ_RedirectUrl"];
 
  public const string GET_AUTH_CODE_URL = "https://graph.qq.com/oauth2.0/authorize";
  public const string GET_ACCESS_TOKEN_URL = "https://graph.qq.com/oauth2.0/token";
  public const string GET_OPENID_URL = "https://graph.qq.com/oauth2.0/me";
 
  /// <summary>
  /// QQ登錄,跳轉到登錄頁面
  /// </summary>
  public override void Login()
  {
    //-------生成唯一隨機串防CSRF攻擊
    string state = GetStateCode();
    Session["QC_State"] = state; //state 放入Session
 
    string parms = "?response_type=code&"
      + "client_id=" + AppId + "&redirect_uri=" + Uri.EscapeDataString(RedirectUrl) + "&state=" + state;
 
    string url = GET_AUTH_CODE_URL + parms;
    Response.Redirect(url); //跳轉到登錄頁面
  }
 
  /// <summary>
  /// QQ回調函數
  /// </summary>
  /// <param name="code"></param>
  /// <param name="state"></param>
  /// <returns></returns>
  public override string Callback()
  {
    string code = Request.QueryString["code"];
    string state = Request.QueryString["state"];
 
    //--------驗證state防止CSRF攻擊
    if (state != (string)Session["QC_State"])
    {
      ShowError("30001");
    }
 
    string parms = "?grant_type=authorization_code&"
      + "client_id=" + AppId + "&redirect_uri=" + Uri.EscapeDataString(RedirectUrl)
      + "&client_secret=" + AppKey + "&code=" + code;
 
    string url = GET_ACCESS_TOKEN_URL + parms;
    string str = GetRequest(url);
 
    if (str.IndexOf("callback") != -1)
    {
      int lpos = str.IndexOf("(");
      int rpos = str.IndexOf(")");
      str = str.Substring(lpos + 1, rpos - lpos - 1);
      NameValueCollection msg = ParseJson(str);
      if (!string.IsNullOrEmpty(msg["error"]))
      {
        ShowError(msg["error"], msg["error_description"]);
      }
 
    }
 
    NameValueCollection token = ParseUrlParameters(str);
    Session["QC_AccessToken"] = token["access_token"]; //access_token 放入Session
    return token["access_token"];
  }
 
 
  /// <summary>
  /// 使用Access Token來獲取用戶的OpenID
  /// </summary>
  /// <param name="accessToken"></param>
  /// <returns></returns>
  public string GetOpenID()
  {
    string parms = "?access_token=" + Session["QC_AccessToken"];
 
    string url = GET_OPENID_URL + parms;
    string str = GetRequest(url);
 
    if (str.IndexOf("callback") != -1)
    {
      int lpos = str.IndexOf("(");
      int rpos = str.IndexOf(")");
      str = str.Substring(lpos + 1, rpos - lpos - 1);
    }
 
    NameValueCollection user = ParseJson(str);
 
    if (!string.IsNullOrEmpty(user["error"]))
    {
      ShowError(user["error"], user["error_description"]);
    }
 
    Session["QC_OpenId"] = user["openid"]; //openid 放入Session
    return user["openid"];
  }
 
  /// <summary>
  /// 顯示錯誤信息
  /// </summary>
  /// <param name="code">錯誤編號</param>
  /// <param name="description">錯誤描述</param>
  private void ShowError(string code, string description = null)
  {
    if (description == null)
    {
      switch (code)
      {
        case "20001":
          description = "<h2>配置文件損壞或無法讀取,請檢查web.config</h2>";
          break;
        case "30001":
          description = "<h2>The state does not match. You may be a victim of CSRF.</h2>";
          break;
        case "50001":
          description = "<h2>可能是服務器無法請求https協議</h2>可能未開啟curl支持,請嘗試開啟curl支持,重啟web服務器,如果問題仍未解決,請聯系我們";
          break;
        default:
          description = "<h2>系統未知錯誤,請聯系我們</h2>";
          break;
      }
      Response.Write(description);
      Response.End();
    }
    else
    {
      Response.Write("<h3>error:<h3>" + code + "<h3>msg:<h3>" + description);
      Response.End();
    }
  }
 
}

3.新浪微博的OAuth類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class SinaOAuth : BaseOAuth
{
  public string AppKey = ConfigurationManager.AppSettings["OAuth_Sina_AppKey"];
  public string AppSecret = ConfigurationManager.AppSettings["OAuth_Sina_AppSecret"];
  public string RedirectUrl = ConfigurationManager.AppSettings["OAuth_Sina_RedirectUrl"];
 
  public const string GET_AUTH_CODE_URL = "https://api.weibo.com/oauth2/authorize";
  public const string GET_ACCESS_TOKEN_URL = "https://api.weibo.com/oauth2/access_token";
  public const string GET_UID_URL = "https://api.weibo.com/2/account/get_uid.json";
 
  /// <summary>
  /// 新浪微博登錄,跳轉到登錄頁面
  /// </summary>
  public override void Login()
  {
    //-------生成唯一隨機串防CSRF攻擊
    string state = GetStateCode();
    Session["Sina_State"] = state; //state 放入Session
 
    string parms = "?client_id=" + AppKey + "&redirect_uri=" + Uri.EscapeDataString(RedirectUrl)
      + "&state=" + state;
 
    string url = GET_AUTH_CODE_URL + parms;
    Response.Redirect(url); //跳轉到登錄頁面
  }
 
  /// <summary>
  /// 新浪微博回調函數
  /// </summary>
  /// <returns></returns>
  public override string Callback()
  {
    string code = Request.QueryString["code"];
    string state = Request.QueryString["state"];
 
    //--------驗證state防止CSRF攻擊
    if (state != (string)Session["Sina_State"])
    {
      ShowError("The state does not match. You may be a victim of CSRF.");
    }
 
    string parms = "client_id=" + AppKey + "&client_secret=" + AppSecret
      + "&grant_type=authorization_code&code=" + code + "&redirect_uri=" + Uri.EscapeDataString(RedirectUrl);
 
    string str = PostRequest(GET_ACCESS_TOKEN_URL, parms);
 
    NameValueCollection user = ParseJson(str);
 
    Session["Sina_AccessToken"] = user["access_token"]; //access_token 放入Session
    Session["Sina_UId"] = user["uid"]; //uid 放入Session
    return user["access_token"];
  }
 
 
  /// <summary>
  /// 顯示錯誤信息
  /// </summary>
  /// <param name="description">錯誤描述</param>
  private void ShowError(string description = null)
  {
    Response.Write("<h2>" + description + "</h2>");
    Response.End();
  }
}

4.微信的OAuth類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
public class WeixinOAuth : BaseOAuth
{
  public string AppId = ConfigurationManager.AppSettings["OAuth_Weixin_AppId"];
  public string AppSecret = ConfigurationManager.AppSettings["OAuth_Weixin_AppSecret"];
  public string RedirectUrl = ConfigurationManager.AppSettings["OAuth_Weixin_RedirectUrl"];
 
  public const string GET_AUTH_CODE_URL = "https://open.weixin.qq.com/connect/qrconnect";
  public const string GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token";
  public const string GET_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo";
 
  /// <summary>
  /// 微信登錄,跳轉到登錄頁面
  /// </summary>
  public override void Login()
  {
    //-------生成唯一隨機串防CSRF攻擊
    string state = GetStateCode();
    Session["Weixin_State"] = state; //state 放入Session
 
    string parms = "?appid=" + AppId
      + "&redirect_uri=" + Uri.EscapeDataString(RedirectUrl) + "&response_type=code&scope=snsapi_login"
      + "&state=" + state + "#wechat_redirect";
 
    string url = GET_AUTH_CODE_URL + parms;
    Response.Redirect(url); //跳轉到登錄頁面
  }
 
  /// <summary>
  /// 微信回調函數
  /// </summary>
  /// <param name="code"></param>
  /// <param name="state"></param>
  /// <returns></returns>
  public override string Callback()
  {
    string code = Request.QueryString["code"];
    string state = Request.QueryString["state"];
 
    //--------驗證state防止CSRF攻擊
    if (state != (string)Session["Weixin_State"])
    {
      ShowError("30001");
    }
 
    string parms = "?appid=" + AppId + "&secret=" + AppSecret
      + "&code=" + code + "&grant_type=authorization_code";
 
    string url = GET_ACCESS_TOKEN_URL + parms;
    string str = GetRequest(url);
 
 
    NameValueCollection msg = ParseJson(str);
    if (!string.IsNullOrEmpty(msg["errcode"]))
    {
      ShowError(msg["errcode"], msg["errmsg"]);
    }
 
    Session["Weixin_AccessToken"] = msg["access_token"]; //access_token 放入Session
    Session["Weixin_OpenId"] = msg["openid"]; //access_token 放入Session
    return msg["access_token"];
  }
 
 
  /// <summary>
  /// 顯示錯誤信息
  /// </summary>
  /// <param name="code">錯誤編號</param>
  /// <param name="description">錯誤描述</param>
  private void ShowError(string code, string description = null)
  {
    if (description == null)
    {
      switch (code)
      {
        case "20001":
          description = "<h2>配置文件損壞或無法讀取,請檢查web.config</h2>";
          break;
        case "30001":
          description = "<h2>The state does not match. You may be a victim of CSRF.</h2>";
          break;
        case "50001":
          description = "<h2>接口未授權</h2>";
          break;
        default:
          description = "<h2>系統未知錯誤,請聯系我們</h2>";
          break;
      }
      Response.Write(description);
      Response.End();
    }
    else
    {
      Response.Write("<h3>error:<h3>" + code + "<h3>msg:<h3>" + description);
      Response.End();
    }
  }
 
}

5.web.config配置信息

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<appSettings>
    <!--QQ登錄相關配置-->
    <add key="OAuth_QQ_AppId" value="123456789" />
    <add key="OAuth_QQ_AppKey" value="25f9e794323b453885f5181f1b624d0b" />
    <add key="OAuth_QQ_RedirectUrl" value="http://www.domain.com/oauth20/qqcallback.aspx" />
 
    <!--新浪微博登錄相關配置-->
    <add key="OAuth_Sina_AppKey" value="123456789" />
    <add key="OAuth_Sina_AppSecret" value="25f9e794323b453885f5181f1b624d0b" />
    <add key="OAuth_Sina_RedirectUrl" value="http://www.domain.com/oauth20/sinacallback.aspx" />
 
    <!--微信登錄相關配置-->
    <add key="OAuth_Weixin_AppId" value="wx123456789123" />
    <add key="OAuth_Weixin_AppSecret" value="25f9e794323b453885f5181f1b624d0b" />
    <add key="OAuth_Weixin_RedirectUrl" value="http://www.domain.com/oauth20/weixincallback.aspx" />
</appSettings>

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 唯美 清纯 另类 亚洲制服 | 日韩精品一区二区三区中文版 | 交换性关系中文字幕6 | 精品AV无码一二三区视频 | 成人免费网址 | 亚洲h片 | 外国老少性配 | 亚洲国产成人久久精品hezyo | 国产成人精品免费久久久久 | 青青久久久国产线免观 | 日韩色在线观看 | 国产九九视频在线观看 | 亚洲人和日本人hd | 亚洲国产精品久久人人爱 | 男人天堂资源网 | 国产欧美一区二区三区久久 | 欧美日韩亚洲高清不卡一区二区三区 | 色图片小说 | 精品久久看 | 女人与zzzooooxxx | 欧美亚洲国产一区二区三区 | 精品一区二区三区免费视频 | 日本性爱 | 范冰冰特黄xx大片 | 魔法满屋免费观看完整版中文 | 97se狠狠狠狠狼亚洲综合网 | 青草午夜精品视频在线观看 | 国产a一级毛片爽爽影院 | 五月天狠狠 | 扒开女人下面使劲桶屁股动漫 | 亚洲高清成人 | 1313午夜精品久久午夜片 | 欧美午夜寂寞影院安卓列表 | 免费人成黄页在线观看69 | 国产高清自拍 | 亚洲人成影院午夜网站 | 1024亚洲精品国产 | 欧美日韩国产一区二区三区在线观看 | 成人在线视频播放 | 成人小视频在线免费观看 | 女烈受刑重口小说 |