91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-01-30 09:58:01 來源:億速云 閱讀:180 作者:小新 欄目:移動開發

小編給大家分享一下ASP.NET怎樣實現QQ、微信、新浪微博OAuth2.0授權登錄,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

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

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

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

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 內部使用函數
  /// <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類

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/oauth3.0/authorize";
  public const string GET_ACCESS_TOKEN_URL = "https://graph.qq.com/oauth3.0/token";
  public const string GET_OPENID_URL = "https://graph.qq.com/oauth3.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 = "<h3>配置文件損壞或無法讀取,請檢查web.config</h3>";
          break;
        case "30001":
          description = "<h3>The state does not match. You may be a victim of CSRF.</h3>";
          break;
        case "50001":
          description = "<h3>可能是服務器無法請求https協議</h3>可能未開啟curl支持,請嘗試開啟curl支持,重啟web服務器,如果問題仍未解決,請聯系我們";
          break;
        default:
          description = "<h3>系統未知錯誤,請聯系我們</h3>";
          break;
      }
      Response.Write(description);
      Response.End();
    }
    else
    {
      Response.Write("<h4>error:<h4>" + code + "<h4>msg:<h4>" + 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/oauth3/authorize";
  public const string GET_ACCESS_TOKEN_URL = "https://api.weibo.com/oauth3/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("<h3>" + description + "</h3>");
    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/oauth3/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 = "<h3>配置文件損壞或無法讀取,請檢查web.config</h3>";
          break;
        case "30001":
          description = "<h3>The state does not match. You may be a victim of CSRF.</h3>";
          break;
        case "50001":
          description = "<h3>接口未授權</h3>";
          break;
        default:
          description = "<h3>系統未知錯誤,請聯系我們</h3>";
          break;
      }
      Response.Write(description);
      Response.End();
    }
    else
    {
      Response.Write("<h4>error:<h4>" + code + "<h4>msg:<h4>" + description);
      Response.End();
    }
  }

}

5.web.config配置信息

<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/oauth30/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/oauth30/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/oauth30/weixincallback.aspx" />
</appSettings>

以上是“ASP.NET怎樣實現QQ、微信、新浪微博OAuth2.0授權登錄”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

哈巴河县| 岑巩县| 宁化县| 那曲县| 乌鲁木齐市| 普定县| 剑阁县| 新泰市| 涞源县| 凭祥市| 靖宇县| 德庆县| 通州区| 涟源市| 韩城市| 大同市| 诏安县| 正阳县| 丰都县| 宣汉县| 西吉县| 抚宁县| 河曲县| 家居| 唐山市| 平定县| 铅山县| 辽宁省| 锡林浩特市| 闸北区| 房产| 石门县| 鸡泽县| 富宁县| 沈丘县| 岳阳市| 麦盖提县| 江陵县| 马公市| 平原县| 阜城县|