2011-04-20 124 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