【问题标题】:Retrieve GMail data through DotNetOpenId通过 DotNetOpenId 检索 GMail 数据
【发布时间】:2009-04-07 16:38:56
【问题描述】:

我正在尝试使用 dotNetOpenId 登录到 GMail 帐户。它有效,但我无法检索任何索赔。我知道我也可以检索电子邮件地址或用户名,但是只有 ClaimedIdentifier 可用,才会返回任何声明。有人知道如何从 Gmail 帐户中检索这些数据吗?如果您能提供一个 ClaimsRequest 配置的示例,我将不胜感激。

谢谢

【问题讨论】:

    标签: gmail dotnetopenauth


    【解决方案1】:
    // Either you're creating this already or you can get to it in 
    // the LoggingIn event of the control you're using.
    
    IAuthenticationRequest request;
    
    // Add the AX request that says Email address is required.
    var fetch = new FetchRequest();
    fetch.Attributes.Add(
        new AttributeRequest(WellKnownAttributes.Contact.Email, true));
    request.AddExtension(fetch);
    

    然后,Google 会对用户进行身份验证并返回您可以使用的电子邮件地址:

    var fetch = openid.Response.GetExtension<FetchResponse>();  
    if (fetch != null) 
    {  
        IList<string> emailAddresses = fetch.GetAttribute(
            WellKnownAttributes.Contact.Email).Values;  
        string email = emailAddresses.Count > 0 ? emailAddresses[0] : null;  
    }
    

    您可以在该主题上查看my blog post 以获取更多信息。这里要注意的重要一点是,如果您将其标记为必需,Google 只会告诉您用户的电子邮件地址(就像我在上面的 sn-p 中所做的那样)。但这也意味着如果用户不想分享他的电子邮件地址,他就根本无法登录。抱歉,Google 就是这样设置的。不幸的是,人们使用的其他提供者有不同的行为。

    【讨论】:

    • 感谢您的回复,我已经在我的代码中使用了您的解决方案,但它不再起作用了,我想是因为我包含的属性不仅仅是电子邮件属性...所以我会将使用此解决方案,我会告诉你..正如你所说,它需要由提供者实施交换!..
    • Google 的独特之处在于它只会为每个用户提供一次属性值。因此,如果您使用自己的 Google 帐户对其进行测试并单击“允许此站点记住我”,则下次它不会提供电子邮件地址。您的 RP 必须存储该值并在用户下次登录时调用它。
    • 我可以强迫谷歌忘记它给了我这些信息吗?
    • 是的。访问google.com/accounts/IssuedAuthSubTokens 并为您的 RP “撤销访问权限”。这将使 Google 下次再次发送数据。
    • 安德鲁,这是一种常见的做法(对于像谷歌这样的提供商)这样做吗?听起来……有点……蹩脚???
    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多