2012-01-18 33 views
0

嗨,我創建了一個網站,我有一個OpenId登錄。 當按下登錄按鈕我打電話,基本上有一個AJAX調用把這稱爲AJAX方法:DotNetOpenAuth和ajax

[WebMethod] 
public static LoginResult Login(string url) 
{ 
    Identifier id; 
    LoginResult result = new LoginResult(); 
    if (Identifier.TryParse(url, out id)) 
    { 
     try 
     { 
      //request openid_identifier 
      FetchRequest fetch = new FetchRequest(); 
      fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email); 
      fetch.Attributes.AddRequired(WellKnownAttributes.Name.Alias); 
      fetch.Attributes.AddRequired(WellKnownAttributes.Name.FullName); 
      fetch.Attributes.AddRequired(WellKnownAttributes.Name.First); 
      fetch.Attributes.AddRequired(WellKnownAttributes.Name.Last); 
      string rootUrl = "http://" + HttpContext.Current.Request.Headers["Host"] + "/"; 
      IAuthenticationRequest request = openid.CreateRequest(url, new Realm(rootUrl), new Uri(rootUrl + "?action=verify")); 
      request.AddExtension(fetch); 
      result.RedirectUrl = request.RedirectingResponse.Headers["Location"]; 
     } 
     catch (ProtocolException ex) 
     { 
      result.ErrorMessage = ex.Message; 
     } 
    } 
    else 
    { 
     result.ErrorMessage = "Could not parse identifier!"; 
    } 

    return result; 
} 

這個偉大工程的JavaScript得到「的redirectUrl」,並重定向到它,在開放ID驗證後供應商做我送回到一些這樣的事

http://localhost:33386/?action=verify&dnoa.userSuppliedIdentifier=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fid&openid.ns=http%3A%2F%2Fspecs.openid.net%2 ............

但是,當我打電話openid.GetResponse()並檢查狀態其失敗。 如果我檢查異常其包含以下消息

的openid.return_to參數 (HTTP://本地主機:33386 /動作=驗證& dnoa.userSuppliedIdentifier = HTTPS:%2F%2Fwww.google。 (http:// localhost:33386/default.aspx?action = verify & dnoa.userSuppliedIdentifier = https:%2F%2Fwww.google.com%2Faccounts% 與實際的網址不符 2Fo8%2Fid & openid.ns = http:%2F%2Fspecs.openid.net%2Fauth ........

我在這裏做錯了什麼?

注: 我之所以嘗試指定RETURNURL是我的web位於〜\ WebApi.aspx這不是我想要當我的要求去做的土地.. 我想看看組件, ILSpy但「CreateRequest」方法或多或少爲空。

回答

1

如果仔細查看錯誤消息中的兩個URL,您會看到明確提到default.aspx,而另一個則沒有。這就是打破它。嘗試調整自己的顯式return_to以包含頁面名稱,它可能會開始爲您工作。

另一方面,從響應中獲取Location HTTP頭並將其發送給Javascript是不可靠的。某些OpenID請求太大,不適合單個URL,Location標頭將爲空。相反,響應對象具有自我提交HTML表單的有效內容。如果它發生跨越最大大小閾值,您的代碼將失敗。但在這裏探索你的選擇值得一個專門的Stackoverflow問題。 :)

+0

感謝您的洞察力,它解決了我的問題! – Peter 2012-01-20 23:56:21