2011-04-20 114 views
1

我想要做的是,如果用戶登錄到Gmail,如果他們去我的網站,他們會自動登錄。如何使用DotNetOpenAuth登錄網站?

我這樣做在以下方式...也許有更好的方式正在做。

在我的網站上,我有一個地方可以給他們的gmail地址,所以我的網站知道註冊用戶的gamil地址。

因此,當他們去我的網站,我想知道他們是否登錄到Gmail和他們的Gmail地址是什麼。

我應該如何使用DotNetOpenAuth找到這些信息?

我從網上找到了以下代碼,它正在對用戶進行身份驗證。但我不得不按下按鈕,每次都進入Gmail登錄。 如果用戶已經在使用Gmail,我不必要求用戶登錄我可以使用它。 我如何修改此代碼以實現這一目標?

static string openidurl = "https://www.google.com/accounts/o8/id"; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    //The Response 
    OpenIdRelyingParty openid = new OpenIdRelyingParty(); 

    var response = openid.GetResponse(); 
    if (response != null) 
    { 
      switch (response.Status) 
      { 
       case AuthenticationStatus.Authenticated: 

       var fetch = response.GetExtension<FetchResponse>(); 
       string email = ""; 
       if (fetch != null) 
       { 
        email = fetch.GetAttributeValue(WellKnownAttributes.Contact.Email); 
       } 
       break; 
       } 
    } 
} 
protected void Button1_Click(object sender, EventArgs e) 
{ 
    using (OpenIdRelyingParty openid = new OpenIdRelyingParty()) 
    { 
     IAuthenticationRequest request = openid.CreateRequest(openidurl); 

     var fetch = new FetchRequest(); 
     fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email); 
     request.AddExtension(fetch); 

     // Send your visitor to their Provider for authentication. 
     request.RedirectToProvider(); 
    } 
} 

回答

3

這聽起來像你問的是「單點登錄」,其中一個訪客您的已登錄Google的網站會在第一次訪問時立即登錄您的網站,而不是在您的網站上點擊「Google登錄」按鈕。

簡短的答案是你不能這樣做。較長的答案是你可以接近。

第一個和嚴格的限制是,您的網站的首次訪問者永遠不會自動登錄,因爲Google和用戶還不信任您的網站。每個用戶都必須明確登錄一次,谷歌會詢問用戶「您是否想登錄該網站並記住這一選擇?」如果他們說是,那麼將來當用戶已經登錄到Google並訪問您的網站時,他們可以點擊您網站上的Google登錄按鈕,他們將永遠不會看到Google - 他們只會立即登錄到您的網站現場。

所以接下來的問題是你如何刪除用戶點擊「谷歌登錄」的要求。您可以通過未經身份驗證的用戶訪問您的網站來實現此目的,您可以立即將其重定向到您的登錄頁面,該頁面將立即使用「即時模式」啓動「Google登錄」流程(OpenIdRelyingParty.CreateRequest(google).RedirectToProvider()調用)。如果用戶未登錄Google並信任您的網站,這將失敗,但影響將是用戶不會看到Google登錄屏幕,如果他們信任您的網站,但寧可立即登錄。

0

你可能會發現我的回答有用:What OpenID solution is really used by Stack Overflow?

我也做了一個簡單的博客文章吧:http://codesprout.blogspot.com/2011/03/using-dotnetopenauth-to-create-simple.html

我的例子是用者myOpenID,但Gmail的應工作方式相同。 OpenID提供者基本上負責登錄,包括他們已經使用提供者登錄的情況。

更新:
在ASP.NET(在這種情況下,ASP.NET MVC)應用程序,你會創建一個cookie,當用戶成功登錄,你會檢查Cookie以確定該用戶登錄正如我所說的,請參閱上面的鏈接以獲取詳細的代碼示例以及它如何工作的解釋。這裏是從控制器兩個代碼示例,我演示瞭如何檢查用戶登錄:

// ************************************** 
// URL: /User/LogIn 
// ************************************** 
public ActionResult LogIn() 
{ 
    if (User.Identity.IsAuthenticated) // <--- CHECKS IF THE USER IS LOGGED IN 
    { 
     return RedirectToAction("Profile", "User"); 
    } 

    Identifier openID; 
    if (Identifier.TryParse(Request.QueryString["dnoa.userSuppliedIdentifier"], out openID)) 
    { 
     return LogIn(new User { OpenID = openID }, Request.QueryString["ReturnUrl"]); 
    } 
    else 
    { 
     return View(); 
    } 
} 

[HttpPost] 
public ActionResult LogIn(User model, string returnUrl) 
{ 
    string openID = ModelState.IsValid?model.OpenID:Request.Form["openid_identifier"]; 

    if (User.Identity.IsAuthenticated)//<--- CHECKS IF THE USER IS LOGGED IN 
    { 
     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

我發現了一個代碼示例,它完成了我想要的一部分,我如何修改它以檢查當前登錄的用戶? – Janaka 2011-04-20 07:02:40

+0

@Janaka您需要查看ASP.NET示例,您擁有的示例不是來自ASP.NET應用程序。我已經用如何驗證用戶當前登錄的示例更新了我的答案。您還可以看到完整解釋的ASP.NET MVC模型,我在這裏解釋過:http://stackoverflow.com/questions/5133921 /什麼-OpenID的解決方案是,真正使用的按計算器/ 5133923#5133923 – Kiril 2011-04-20 12:15:21