首页 > 编程 > .NET > 正文

ASP.NET实现QQ、微信、新浪微博OAuth2.0授权登录 原创

2024-07-10 12:47:26
字体:
来源:转载
供稿:网友

不管是腾讯还是新浪,查看他们的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}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表