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

ホームページ WeChat アプレット WeChatの開(kāi)発 QQ、WeChat、Sina WeiboのOAuth2.0認(rèn)証ログインを?qū)g裝したASP.NETの例を詳しく解説

QQ、WeChat、Sina WeiboのOAuth2.0認(rèn)証ログインを?qū)g裝したASP.NETの例を詳しく解説

Apr 25, 2017 am 10:44 AM
asp.net 許可されたログイン

この記事では、主に QQ、WeChat、および Sina Weibo の OAuth2.0 認(rèn)証ログインの例を紹介します。主に GET および POST リモート インターフェイスを使用して、対応するデータを返します。參考のためにここにリストします。

Tencent にせよ Sina にせよ、API を見(jiàn)ると、PHP には完全なインターフェイスがありますが、C# のサポートはそれほど完全ではないようです。Tencent にはまったくありません。Sina にはそれがありません。サードパーティが提供しているので、後で利用できなくなります。サードパーティのライブラリを使用する場(chǎng)合は、その規(guī)約に従ってさまざまな設(shè)定を記述する必要があります。後から拡張するのも簡(jiǎn)単ですが、いくつかのソースコードを參照してみると、それほど難しいことではありません。戻り値を取得するためにインターフェイスを要求する GET または POST については、ここでは參照用のコードをいくつか紹介します。 。 。

私の書き方の特徴は、Sessionを使用することです。オブジェクトをインスタンス化した後、Login()を呼び出してログインページにジャンプします。コールバックページでCallback()を呼び出した後、Sessionから獨(dú)立した関數(shù)を書くことができます。 : 次のステップを容易にするために、GetOpenID()) で access_token またはユーザーの一意の識(shí)別子を取得します。いわゆるバインドとは、ユーザーの一意の識(shí)別子を取り出してデータベースに挿入し、アカウントにバインドすることです。

1. まず、すべての OAuth クラスの基本クラスに、public にする必要があるメソッドをいくつか配置します

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來(lái)獲取用戶的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>配置文件損壞或無(wú)法讀取,請(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ù)器無(wú)法請(qǐng)求https協(xié)議</h2>可能未開(kāi)啟curl支持,請(qǐng)嘗試開(kāi)啟curl支持,重啟web服務(wù)器,如果問(wèn)題仍未解決,請(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. .WeChat の 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();
  }
}

5.web.config 設(shè)定情報(bào)

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>配置文件損壞或無(wú)法讀取,請(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();
    }
  }

}

以上がQQ、WeChat、Sina WeiboのOAuth2.0認(rèn)証ログインを?qū)g裝したASP.NETの例を詳しく解説の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)