【ASP.net MVC】项目放置 Facebook 登入

【ASP.net MVC】项目放置 Facebook 登入-- OAuth 认证(3)
前一篇,已经跟各位说明如何透过范本建立Facebook的验证,但是取得的数据有限,可能有部分网站只需要几项注册资讯就可以使用了,但是可能比较复杂的注册网站,可能需要出生日期、所在地点、性别...的数据,此时内建的验证所取得的数据就不太符合我们的需求了!所以,这边接下来要让使用者登入Facebook账号后,直接取得使用者的资讯!虽然这个可以利用让使用者后续透过输入的方式处理,但是通常使用者很懒得再去输入这些数据。
接下来,我们需要去撰写一些程序,才有办法达到我们所要求的数据(当然,还是使用者按下同意按钮,才有办法取得)!
首先,我们需要把底层的OAuth的验证做些修改((这些修改,几乎把我们要用的类都改写了...)),以下是小弟在网络上搜寻到的程序,部分有稍作修改,并且加入了注解,以供阅读!


前一篇,已经跟各位说明如何透过范本建立Facebook的验证,但是取得的数据有限,可能有部分网站只需要几项注册资讯就可以使用了,但是可能比较复杂的注册网站,可能需要出生日期、所在地点、性别...的数据,此时内建的验证所取得的数据就不太符合我们的需求了!所以,这边接下来要让使用者登入Facebook账号后,直接取得使用者的资讯!虽然这个可以利用让使用者后续透过输入的方式处理,但是通常使用者很懒得再去输入这些数据。

接下来,我们需要去撰写一些程序,才有办法达到我们所要求的数据(当然,还是使用者按下同意按钮,才有办法取得)!

首先,我们需要把底层的OAuth的验证做些修改((这些修改,几乎把我们要用的类都改写了...)),以下是小弟在网络上搜寻到的程序,部分有稍作修改,并且加入了注解,以供阅读!

原始连结请点这


public class FacebookScopedClient : IAuthenticationClient
{
    private string appId;
    private string appSecret;

    //设置基础连结,显示验证窗口的对话方块
    private const string BaseUrl = "https://www.facebook.com/dialog/oauth?client_https://graph.facebook.com/oauth/access_token?";
    //设置基础连结,取得使用者数据
    public const string GraphApiMe = "https://graph.facebook.com/me?";

    /// 
    /// 【私用】取得要求页面的网页资讯
    /// 
    /// 要求的连结
    /// 
    private static string GetHTML(string URL)
    {
        string ConnectionString = URL;

        try
        {
            // 向对方Server传送要求
            System.Net.HttpWebRequest MyRequest = (HttpWebRequest)WebRequest.Create(ConnectionString);
            MyRequest.Credentials = CredentialCache.DefaultCredentials;
            //// 取得网站的响应
            WebResponse WebResponse = MyRequest.GetResponse();
            Stream ResponeStream = WebResponse.GetResponseStream();
            ////开启数据读取串流
            StreamReader IOStream = new StreamReader(ResponeStream);
            string PageContent = IOStream.ReadToEnd();
            //// 关闭串流
            IOStream.Close();
            ResponeStream.Close();
            return PageContent;
        }
        catch (Exception)
        {
        }
        return null;
    }

    /// 
    /// 解析使用者数据
    /// 
    /// 数据授权码
    /// 返回的页面连结
    /// 
    private IDictionary GetUserData(string AccessCode, string RedirectURI)
    {
        //取得授权Token
        string Token = GetHTML(GraphApiToken + "client_&redirect_uri=" + HttpUtility.UrlEncode(RedirectURI) + "&client_secret=" + appSecret + "&code=" + AccessCode);
        if (Token == null || Token == "")//若Token是null或空白,表示验证失败
        {
            return null;
        }
        //向Facebook传送要求,取得使用者数据,fields则放置你所需要的数据
        string Data = GetHTML(GraphApiMe + "fields=id,name,email,username,gender,link,birthday&access_token=" + Substring(Token, "access_token=", "&"));

        //解析Facebook返回的使用者数据,Facebook返回的是Json格式的数据,我们这边利用Json.net这个套件解析Json
        //Json.net则可以透过NuGet取得
        Dictionary UserData = JsonConvert.DeserializeObject>(Data);
        return UserData;
    }


    /// 
    /// 初始化
    /// 
    /// 授权代码
    /// 授权安全码
    public FacebookScopedClient(string appId, string appSecret)
    {
        this.appId = appId;
        this.appSecret = appSecret;
    }

    /// 
    /// 返回供应商名称
    /// 
    public string ProviderName
    {
        get { return "Facebook"; }
    }

    /// 
    /// 导向Facebook验证授权页面
    /// 
    /// Http要求资讯
    /// 通过授权后导回的页面
    public void RequestAuthentication(System.Web.HttpContextBase Context, Uri ReturnUrl)
    {
        string Url = BaseUrl + appId + "&redirect_uri=" + HttpUtility.UrlEncode(ReturnUrl.ToString()) + "&scope=email,user_birthday,user_location,publish_actions";
        Context.Response.Redirect(Url);
    }

    /// 
    /// 返回授权状态与授权数据
    /// 
    /// Http要求资讯
    /// 授权状态与授权数据
    public AuthenticationResult VerifyAuthentication(System.Web.HttpContextBase Context)
    {
        string Code = Context.Request.QueryString["code"];

        string RawUrl = Context.Request.Url.OriginalString;

        RawUrl = Regex.Replace(RawUrl, "&code=[^&]*", "");

        IDictionary UserData = this.GetUserData(Code, RawUrl);

        //假如使用者资讯为空白,就返回验证失败
        if (UserData == null)
            return new AuthenticationResult(false, ProviderName, null, null, null);

        string id = UserData["id"];
        string UserName = UserData["username"];
        UserData.Remove("id");
        UserData.Remove("username");

        return new AuthenticationResult(true, ProviderName, id, UserName, UserData);
    }

    /// 
    /// 私用,撷取部分字符串数据
    /// 
    /// 原始字符串
    /// 开始撷取的字符串内容
    /// 结束撷取的字符串内容
    /// 原始字符串的内容
    private string Substring(string Str, string StartString, string EndString)
    {
        if (Str.Contains(StartString))
        {
            int iStart = Str.IndexOf(StartString) + StartString.Length;
            int iEnd = Str.IndexOf(EndString, iStart);
            return Str.Substring(iStart, (iEnd - iStart));
        }
        return null;
    }
}

既然我们已经准备好了Facebook可以自订使用者数据的类了,接下来我们要去设定AuthConfig.cs的OAuth的认证

我们的类不是微软所提供的,所以我们使用RegisterClient,来注册我们的Facebook登入


OAuthWebSecurity.RegisterClient(new FacebookScopedClient("appId", "appSecret"), "Facebook", null);

至于我们原本范本建立出来的Controllers,其实不需要太大的更改,除非有特别的需求,才需要稍作修改

其实要写出一个Facebook验证,并不会太困难!

文件下载:

FacebookScopedClient下载

参考数据:

Facebook权限要求设定:https://developers.facebook.com/docs/reference/login/open-graph-permissions/

Facebook Graph API Explorer:https://developers.facebook.com/tools/explorer

本篇相关:

OAuth(一) 

OAuth(二)


大家好我是馒头,希望大家喜欢我的文章

如果有错误的地方请不吝指教 ^_^