国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) 微信小程序 微信開發(fā) ASP.NET實(shí)現(xiàn)QQ、微信、新浪微博OAuth2.0授權(quán)登錄的實(shí)例詳解

ASP.NET實(shí)現(xiàn)QQ、微信、新浪微博OAuth2.0授權(quán)登錄的實(shí)例詳解

Apr 25, 2017 am 10:44 AM
asp.net 授權(quán)登錄

本文主要介紹了QQ、微信、新浪微博OAuth2.0授權(quán)登錄的示例,主要就是GET、POST遠(yuǎn)程接口,返回相應(yīng)的數(shù)據(jù),這里列出相關(guān)的代碼,供大家參考。

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

我這個(gè)寫法的特點(diǎn)是,用到了Session,使用對(duì)象實(shí)例化之后調(diào)用 Login() 跳轉(zhuǎn)到登錄頁(yè)面,在回調(diào)頁(yè)面調(diào)用Callback() 執(zhí)行之后,可以從Session也可以寫?yīng)毩⒌暮瘮?shù)(如:GetOpenID())中獲取access_token或用戶的唯一標(biāo)識(shí),以方便做下一步的操作。所謂綁定就是把用戶的唯一標(biāo)識(shí)取出,插入數(shù)據(jù)庫(kù),和帳號(hào)綁定起來。

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

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 內(nèi)部使用函數(shù)
  /// <summary>
  /// 生成唯一隨機(jī)串防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請(qǐng)求
  /// </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請(qǐng)求
  /// </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參數(shù)
    StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream());
    try
    {
      requestWriter.Write(postData);
    }
    finally
    {
      requestWriter.Close();
    }

    //讀取請(qǐng)求后的結(jié)果
    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(&#39;&&#39;))
    {
      string[] ps = p.Split(&#39;=&#39;);
      nc.Add(ps[0], ps[1]);
    }
    return nc;
  }

  #endregion

}

2.QQ的OAuth類

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登錄,跳轉(zhuǎn)到登錄頁(yè)面
  /// </summary>
  public override void Login()
  {
    //-------生成唯一隨機(jī)串防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); //跳轉(zhuǎn)到登錄頁(yè)面
  }

  /// <summary>
  /// QQ回調(diào)函數(shù)
  /// </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"];

    //--------驗(yàn)證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>
  /// 顯示錯(cuò)誤信息
  /// </summary>
  /// <param name="code">錯(cuò)誤編號(hào)</param>
  /// <param name="description">錯(cuò)誤描述</param>
  private void ShowError(string code, string description = null)
  {
    if (description == null)
    {
      switch (code)
      {
        case "20001":
          description = "<h2>配置文件損壞或無法讀取,請(qǐng)檢查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>可能是服務(wù)器無法請(qǐng)求https協(xié)議</h2>可能未開啟curl支持,請(qǐng)嘗試開啟curl支持,重啟web服務(wù)器,如果問題仍未解決,請(qǐng)聯(lián)系我們";
          break;
        default:
          description = "<h2>系統(tǒng)未知錯(cuò)誤,請(qǐng)聯(lián)系我們</h2>";
          break;
      }
      Response.Write(description);
      Response.End();
    }
    else
    {
      Response.Write("<h3>error:<h3>" + code + "<h3>msg:<h3>" + description);
      Response.End();
    }
  }

}

3.新浪微博的OAuth類

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>
  /// 新浪微博登錄,跳轉(zhuǎn)到登錄頁(yè)面
  /// </summary>
  public override void Login()
  {
    //-------生成唯一隨機(jī)串防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); //跳轉(zhuǎn)到登錄頁(yè)面
  }

  /// <summary>
  /// 新浪微博回調(diào)函數(shù)
  /// </summary>
  /// <returns></returns>
  public override string Callback()
  {
    string code = Request.QueryString["code"];
    string state = Request.QueryString["state"];

    //--------驗(yàn)證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>
  /// 顯示錯(cuò)誤信息
  /// </summary>
  /// <param name="description">錯(cuò)誤描述</param>
  private void ShowError(string description = null)
  {
    Response.Write("<h2>" + description + "</h2>");
    Response.End();
  }
}

4.微信的OAuth類

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>
  /// 微信登錄,跳轉(zhuǎn)到登錄頁(yè)面
  /// </summary>
  public override void Login()
  {
    //-------生成唯一隨機(jī)串防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); //跳轉(zhuǎn)到登錄頁(yè)面
  }

  /// <summary>
  /// 微信回調(diào)函數(shù)
  /// </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"];

    //--------驗(yàn)證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>
  /// 顯示錯(cuò)誤信息
  /// </summary>
  /// <param name="code">錯(cuò)誤編號(hào)</param>
  /// <param name="description">錯(cuò)誤描述</param>
  private void ShowError(string code, string description = null)
  {
    if (description == null)
    {
      switch (code)
      {
        case "20001":
          description = "<h2>配置文件損壞或無法讀取,請(qǐng)檢查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>接口未授權(quán)</h2>";
          break;
        default:
          description = "<h2>系統(tǒng)未知錯(cuò)誤,請(qǐng)聯(lián)系我們</h2>";
          break;
      }
      Response.Write(description);
      Response.End();
    }
    else
    {
      Response.Write("<h3>error:<h3>" + code + "<h3>msg:<h3>" + description);
      Response.End();
    }
  }

}

5.web.config配置信息

<appSettings>
    <!--QQ登錄相關(guān)配置-->
    <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" />

    <!--新浪微博登錄相關(guān)配置-->
    <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" />

    <!--微信登錄相關(guān)配置-->
    <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>

以上是ASP.NET實(shí)現(xiàn)QQ、微信、新浪微博OAuth2.0授權(quán)登錄的實(shí)例詳解的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72