2013-01-13 107 views
0

我正在嘗試創建DotNetOpenAuth OpenID MVC 3項目,但無法接收用戶身份驗證狀態。我的post方法工作正常,但當請求返回到HttpGet方法,並且我檢查User.Identity.IsAuthenticated狀態時,它會在我已成功登錄到任何openID提供程序時返回false。MVC 3 - DotNetOpenAuth OpenID未返回經過身份驗證的用戶

我已經啓用了在webconfig dotNetOpenAuth untrustedWebRequest尚未解決的問題本地主機通信,我已經花了幾個小時尋找一個答案,爲什麼用戶不被返回一個身份驗證的用戶。

必須存在一些邏輯錯誤,導致用戶不能從我的代碼中驗證的openID提供程序返回,但我找不到它。

感謝您對我的問題的任何迴應!

我的控制器:

namespace DotNetOpenAuth_OpenID.Controllers 
{ 
    public class UserController : Controller 
    { 
    private static OpenIdRelyingParty openid = new OpenIdRelyingParty(); 
    public IFormsAuthenticationService FormsService { get; set; } 

    protected override void Initialize(RequestContext requestContext) 
    { 
     if (FormsService == null) 
     { 
      FormsService = new AuthenticationService(); 
     } 

     base.Initialize(requestContext); 
    } 

    // ************************************** 
    // URL: /User/LogIn 
    // ************************************** 
    [HttpGet] 
    public ActionResult LogIn() 
    { 
     if (User.Identity.IsAuthenticated) <===== RETURNS FALSE 
     { 
      return RedirectToAction("Profile", "User"); 
     } 

     Identifier id; 
     if (Identifier.TryParse(Request.Form["openid_identifier"], out id)) 
     { 
      try 
      { 
       var req = openid.CreateRequest(Request.Form["openid_identifier"]); 
       return req.RedirectingResponse.AsActionResult(); 
      } 
      catch (ProtocolException ex) 
      { 
       //display error by showing original LogOn view 
       //this.ErrorDisplay.ShowError("Unable to authenticate: " + ex.Message); 
       return View("Login"); 
      } 
      //return LogIn(new User { OpenID = id }, Request.Form["ReturnUrl"]); 
     } 
     return View("Login"); 
    } 

    [HttpPost] 
    public ActionResult LogIn(User model, string returnUrl) 
    { 

     string openID = ModelState.IsValid ? model.OpenID :  Request.Form["openid_identifier"]; 

     if (User.Identity.IsAuthenticated) 
     { 
      return RedirectToAction("Profile", "User"); 
     } 
     else if (!string.IsNullOrEmpty(openID)) 
     { 
      return Authenticate(openID, returnUrl); 
     } 
     else if (ModelState.IsValid) 
     { 
      ModelState.AddModelError("error", "The OpenID field is required."); 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

回答

0

我以下,可以在http://codesprout.blogspot.com/search/label/openid發現,並沒有實現所有的代碼還沒有,這就是爲什麼用戶從未返回的認證的例子。我錯過了對var response = openid.GetResponse()的調用,這是在控制器中稱爲Authenticate的另一個方法內。整個代碼的另一個來源可以在這裏找到堆棧溢出帖子What OpenID solution is really used by Stack Overflow?

+0

我還發現CodePlex上的Nerd Dinner項目深入到MVC 3&4的許多方面,但也有你可能需要建立一個DotNetOpenAuth openId認證用戶界面供客戶端登錄。在學習代碼時你需要付出一些努力,但它確實按照廣告的方式工作。 – Shawn

相關問題