2012-09-24 43 views
1

我一直在努力讓OAuth工作在我的MVC4移動應用上。如何讓MVC4移動應用上的OAuth工作

我基本上

  1. 創建一個MVC4移動應用
  2. 創建複製的AccountController,AccountModel,InitializeSimpleMembershipAttribute和所有的意見到我MVC4 Mobile應用程序的MVC4 Web應用程序
  3. 啓用谷歌和Facebook OAuth提供商
  4. 我也確保RoleManager根據simplemembershipprovider-not-working進行了初始化,儘管我沒有我認爲這很重要。 (我需要它的一些基於角色的安全性,我正在測試)
  5. 通過設置data-ajax =「false」來禁用ajax(我認爲): using (Html.BeginForm("ExternalLogin", "Account",new RouteValueDictionary { { "ReturnUrl", ViewBag.ReturnUrl } }, FormMethod.Post, new Dictionary<string, object> { { "data-ajax", false } }))(這似乎對頁面沒有任何影響 - 所以我可在這裏做得不對...)

我能到登錄視圖/帳號/登錄,當我點擊谷歌的按鈕,調試器斷裂成public ActionResult ExternalLogin(string provider, string returnUrl)

但是 - 在public ActionResult ExternalLoginCallback(string returnUrl)是從來沒有打。 視覺上,我得到了jQuery Mobile的「頁面加載」動畫 - 然後我得到「錯誤加載頁面」

我有兩個問題:

  1. 我怎樣才能得到更多的信息,當我試圖找出什麼發生?
  2. 我如何獲得在我的MVC4移動網站上工作的OAuth?

BTW:這兩個網站的目標.Net4.0

回答

2

OK - 所以我想通了答案 - 在cuplrit的確是jQuery Mobile的阿賈克斯。

我修改_layout.cshtml,以便它可以使裝載jQuery的後定製腳本,但加載jQuery Mobile的面前:

@Scripts.Render("~/bundles/jquery","~/scripts/RemoveHashFromWindowLocation") 
    @RenderSection("beforeJqueryMobile", required: false); 
    @Scripts.Render("~/bundles/jquerymobile") 
    @RenderSection("scripts", required: false) 

然後我修改了Login.cshtml以便它包含以下部分:

@section BeforeJqueryMobile { 
    @Scripts.Render("~/scripts/disable-ajax.js") 
} 

最後,我添加了以下到我的腳本文件夾:

禁用-ajax.js:

$(document).bind("mobileinit", function() { 
    $.mobile.ajaxEnabled = false; 
}); 

RemoveHashFromWindowLocation.js:(感謝Facebook Oauth Login With Jquery Mobile #_=_

if (window.location.hash == "#_=_") 
    window.location.hash = ""; 

瞧 - OAuth的使用jQuery移動的工作。:-)

0

如果您的網站直接加載到登錄頁面,上述來自espenalb的答案確實有效,但是如果您有一個主頁並指向登錄頁面(使用相同佈局)的鏈接,那麼您當您點擊其中一個社交登錄按鈕時將會出現錯誤加載頁面。

要解決此添加

<script> 

    $('#login-link').live("click", function() { 
     $.mobile.ajaxEnabled = false; 
    }); 

</script> 

到您的移動佈局頁面的底部,這將附加一個事件處理程序,將禁用AJAX的登錄鏈接。