无法从DotNetOpenId响应中获取属性

时间:2009-07-04 16:10:19

标签: openid dotnetopenauth

我试图弄清楚如何通过open 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);

知道我做错了吗?

更新

添加安德鲁建议的配置信息让我成为了那里的一部分。我终于使用response.GetUntrustedExtension<ClaimsResponse>返回ClaimsResponse但是response.GetExtension<ClaimsResponse>仍然返回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

1 个答案:

答案 0 :(得分:10)

您正在测试的提供商很可能不支持这些扩展。或者,如果是谷歌,它只回答一次问题(除非在登录时你小心离开记住我检查过。)

现在使用DotNetOpenAuth v3.2,发送扩展的最佳方式可能是使用新的属性扩展“行为”。它将自动使用sreg和/或AX(最多三种不同的AX格式),具体取决于提供商,以便在提供商支持任何这些扩展时最大限度地获得有用结果的机会。

将此位粘贴在您的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显然必须是公开的,甚至可以发现(根据RPID发现的OpenID 2.0规则),以便尊重属性请求。这可能是你遇到的。