如何使用DotNetOpenAuth登录网站?

时间:2011-04-20 03:48:25

标签: asp.net authentication logging dotnetopenauth

我想要做的是,如果用户登录到gmail,如果他们访问我的网站,他们会自动登录。

我是按照以下方式进行的...也许还有更好的方法。

在我的网站上,我有一个用于提供他们的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();
    }
}

2 个答案:

答案 0 :(得分:3)

听起来您要求的是“单点登录”,您网站上已登录Google的访问者在首次访问时会立即登录您的网站,而非点击您网站上的“Google登录”按钮。

简短的回答是你不能这样做。更长的答案是你可以接近。

第一个也是硬性限制是,首次访问您网站的访问者永远不会自动登录,因为Google和用户还不信任您的网站。每个用户都必须明确登录一次,Google会询问用户“您是否要登录此站点并记住此选择?”如果他们说是,那么将来当用户已登录Google并访问您的网站时,他们可以点击您网站上的Google登录按钮,他们将永远不会看到Google - 他们会立即登录到您的网站站点。

接下来的问题是如何删除用户点击“google登录”的要求。您可以通过未经身份验证的用户访问您的网站来实现此目的,您可以立即将其重定向到您的登录页面,这将立即使用“立即模式”启动“Google登录”流程(OpenIdRelyingParty.CreateRequest(google).RedirectToProvider()调用)。如果用户未登录Google并信任您的网站,则会失败,但影响是,如果用户 信任您的网站,用户将无法看到Google登录屏幕,立即登录。

答案 1 :(得分: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以确定用户是否已登录。正如我所说,请参阅链接上面是详细的代码示例以及它们如何工作的解释。以下是来自Controller的两个代码示例,其中演示了如何检查用户是否已登录:

// **************************************
// 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);
}