7

オープンIDで検証した後、ユーザー情報を取得する方法を見つけようとしています。呼び出すたびに ClaimsRequest または FetchRequest を提供するかどうかは問題ではありません

response.GetExtension<ClaimsResponse>

//Or

response.GetExtension<FetchResponse>

//Or

response.GetUntrustedExtension<ClaimsResponse>

// OR

response.GetUntrustedExtension<FetchResponse>

私は常に null 参照を取得します。私が見たすべての例と同じように、次のように情報を追加しています。

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

// Or

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

私が間違っていることは何か分かりますか?

アップデート

Andrew によって提案された構成情報を追加すると、そこにたどり着きました。最終的に ClaimsResponse を取得していますresponse.GetUntrustedExtension<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を実行しています

4

1 に答える 1

10

テスト対象のプロバイダーがこれらの拡張機能をサポートしていない可能性が非常に高いです。または、Google の場合は、質問に 1 回だけ回答します (ログイン時に [ Remember Me] をチェックしたままにしないように注意している場合を除きます)。

DotNetOpenAuth v3.2 では、拡張子を送信する最善の方法は、おそらく新しい属性拡張子「behavior」を使用することです。プロバイダーがこれらの拡張機能のいずれかをサポートしている場合に有用な結果を得る可能性を最大化するために、プロバイダーに応じて sreg および/または AX (最大 3 つの異なる AX 形式) を自動的に使用します。

このビットを web.config ファイルに貼り付けます。これは、完全な構成の wiki ページで提案されている場所です。

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

次に、AX' の代わりにClaimsRequest/ ClaimsResponse(sreg) を使用FetchRequestして、ビヘイビアーが機能できるようにします。

myopenid.com に対してテストしていると述べたので、'localhost' にある RP をテストしているときに、拡張機能のサポートがオフになっているように見えることも頭に入れておきます。属性要求が受け入れられるには、RP が公開されている必要があり、(RP 検出に関する OpenID 2.0 ルールに従って) 検出可能である必要があるようです。これはあなたが遭遇しているものかもしれません。

于 2009-07-05T01:20:36.840 に答える