【问题标题】:Cannot get attributes from DotNetOpenId response无法从 DotNetOpenId 响应中获取属性
【发布时间】:2009-07-04 16:10:18
【问题描述】:

我试图弄清楚如何在通过开放 ID 验证后获取用户信息。每次调用时提供 ClaimsRequest 或 FetchRequest 都没有关系

response.GetExtension<ClaimsResponse>

//Or

response.GetExtension<FetchResponse>

//Or

response.GetUntrustedExtension<ClaimsResponse>

// OR

response.GetUntrustedExtension<FetchResponse>

我总是得到一个空引用。我正在添加信息,就像在我见过的所有示例中一样:

request.AddExtension(new ClaimsRequest{ Email = DemandLevel.Require });

// Or

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

知道我做错了什么吗?

更新

添加 Andrew 建议的配置信息让我成功了。我终于收到了 response.GetUntrustedExtension&lt;ClaimsResponse&gt; 的 ClaimsResponse,但是 response.GetExtension&lt;ClaimsResponse&gt; 仍然返回 null。此外,返回的 ClaimsResponse 实际上并不包含我请求的任何数据。这是请求:

var request = openId.CreateRequest(Request.Form["openid_identifier"]);
request.AddExtension(new ClaimsRequest
    {
        BirthDate = DemandLevel.Request,
        Country = DemandLevel.Request,
        Email = DemandLevel.Require,
        FullName = DemandLevel.Request,
        Gender = DemandLevel.Request,
        Language = DemandLevel.Request,
        Nickname = DemandLevel.Request,
        PostalCode = DemandLevel.Request,
        TimeZone = DemandLevel.Request 
      });

      return request.RedirectingResponse.AsActionResult();

这是我的配置

  <uri>
    <idn enabled="All"/>
    <iriParsing enabled="true"/>
  </uri>
  <dotNetOpenAuth>
    <openid maxAuthenticationTime="0:05">
      <relyingParty>
        <security
                    requireSsl="false"
                    minimumRequiredOpenIdVersion="V10"
                    minimumHashBitLength="160"
                    maximumHashBitLength="256"
                    requireDirectedIdentity="false"
                    requireAssociation="false"
                    rejectUnsolicitedAssertions="false"
                    rejectDelegatingIdentifiers="false"
                    ignoreUnsignedExtensions="false"
                    privateSecretMaximumAge="07:00:00" />
        <behaviors>
          <add type="DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth" />
        </behaviors>
      </relyingParty>
    </openid>
    <messaging>
      <untrustedWebRequest>
        <whitelistHosts>
          <!-- since this is a sample, and will often be used with localhost -->
          <add name="localhost" />
        </whitelistHosts>
      </untrustedWebRequest>
    </messaging>

我正在运行 v3.2.0.9177

【问题讨论】:

  • 你能包括你正在测试的 OP 吗?
  • 行为配置将导致 ClaimsResponse 始终存在,即使没有任何值,正如您所说。看起来您的代码是正确的,并且由于 myopenid 同时支持 sreg 和 AX,我很惊讶这对您不起作用。我会看看我是否可以做更多的调查。
  • 我在我的回答中添加了一条关于针对 myopenid.com 进行测试的评论,因为我想这就是您遇到的问题。也只是一个提示,如果您将其逐字保留在 wiki 页面中,则您添加到 web.config 文件中的安全标记不是必需的。这些都是默认值。我在这里看到的唯一重大变化是您将“localhost”添加为白名单主机以及我们讨论的行为。

标签: openid dotnetopenauth


【解决方案1】:

很可能是您正在测试的 Provider 不支持这些扩展。或者,如果是 Google,它只会回答一次问题(除非在登录期间您小心勾选“记住我”)。

现在使用 DotNetOpenAuth v3.2,发送扩展的最佳方式可能是使用新的属性扩展“行为”。它将根据 Provider 自动使用 sreg 和/或 AX(最多三种不同的 AX 格式),以便在 Provider 完全支持任何这些扩展的情况下最大限度地提高您获得有用结果的机会。

将这一点粘贴到您的 web.config 文件中,在 full configuration wiki page 中建议的位置。

<behaviors>
    <add type="DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth" />
</behaviors>

然后使用 ClaimsRequest/ClaimsResponse (sreg) 而不是 AX' FetchRequest 以便行为可以发挥作用。

既然您提到您正在针对 myopenid.com 进行测试,我也会提醒您,当您测试“localhost”上的 RP 时,他们似乎关闭了扩展支持。您的 RP 显然必须是公开的,甚至可能是可发现的(根据用于 RP 发现的 OpenID 2.0 规则),才能兑现属性请求。这可能是您遇到的问题。

【讨论】:

  • 我敢打赌“本地主机”问题就是问题所在。我还没有机会测试它,但是我会在今天下午有机会查看它时再发回这里。
  • 我发现这很有帮助,因为我无法从本地主机获取 myopenid 的扩展。谢谢安德鲁
  • 这解决了我的问题,谢谢安德鲁!要添加的一件事是,这是behaviorsrelyingParty 下。
  • @Andrew Arnott “必须公开,甚至可能被发现” - 有没有一种简单的方法可以查看这是否真的是我遇到的问题?请注意,我还没有合适的域来附加我的代码,这就是我仍在本地主机上的原因。
  • 不是真的,@Matt。如果您在非公共主机上,您将无法检测到失败的来电。
猜你喜欢
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 2014-05-18
  • 2023-03-09
  • 2013-05-07
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多