6

更新 @IvanLによるコメントのおかげで、問題はGoogle固有のものであることが判明しました。それ以来、私は他のプロバイダーを試しましたが、それらについてはすべてが期待どおりに機能します。Googleはクレーム情報を送信していないようです。Googleに送信させるために、なぜ、または何を変える必要があるのか​​をまだ理解できていません。

暗闇の中での野生の刺し傷は、レルムがデフォルトでhttp://:/になっていることに関連している可能性があると言っています。これは、認証で渡されたレルムに基づいて、Googleが同じアカウントの要求された識別子を変更するというAndrewArnottの回答を見たためです。リクエスト。

もう1つの重要な情報:dotnetopenauthを使用するためにWebで見られる多くの例とは異なり、私は「単純な」テキストボックスを使用せず、自分でopenIdIdentifierを作成していますが、openIDセレクターを使用しています。openIdIdentifierに渡されますValidateAtOpenIdProvider( ASP.NET MVC 4アプリケーションへのOpenID認証の追加に関する記事のとおりです。)

質問は次のとおりです。GoogleをopenIdプロバイダーとして使用する場合、IAuthenticationResponse.GetExtension()が常にnullを返すのはなぜですか。それ以外の場合、Googleに関連するすべての落とし穴(必要に応じて要求される電子メール、AXFetchAsSregTransformなど)に対処しているのですか?

オリジナル

DotNetOpenAuthにプロバイダーから返された応答を解析させるのに苦労しています。ログインが機能するポイントまでASP.NETMVC4アプリケーションにOpenID認証を追加する手順に従い、ログインすると、右上にユーザー名(ニックネーム)が表示されたホームページに戻ります。(これは、「ユーザーはこの時点で次のことを確認する必要があります:」までです)。

Visual Studio Web Developer 2010 ExpressをC#で使用しています。DotNetOpenAuthのバージョンは4.0.3.12153です(packages.configによると、Windowsエクスプローラーによると4.0.3.12163)。

私のweb.configは、 DotNetOpenIdのソリューションであるAXFetchAsSregTransformのアクティブ化の手順に従って変更されました-OpenIdはいくつかのデータを取得します

残念ながら、それを機能させるには十分ではありませんでした。

openid-selectorは正常に機能しており、openidプロバイダーが正しく選択されています。認証要求は次のように作成されます。

    public IAuthenticationRequest ValidateAtOpenIdProvider(string openIdIdentifier)
    {
        IAuthenticationRequest openIdRequest = openId.CreateRequest(Identifier.Parse(openIdIdentifier));

        var fields = new ClaimsRequest()
        {
            Email = DemandLevel.Require,
            FullName = DemandLevel.Require,
            Nickname = DemandLevel.Require
        };
        openIdRequest.AddExtension(fields);

        return openIdRequest;
    }

これはすべて機能します。ログインしてページに自分の情報を受信することを承認すると、次の呼び出しが発生しGetUserます。

    public OpenIdUser GetUser()
    {
        OpenIdUser user = null;
        IAuthenticationResponse openIdResponse = openId.GetResponse();

        if (openIdResponse.IsSuccessful())
        {
            user = ResponseIntoUser(openIdResponse);
        }

        return user;
    }

openIdResponse.IsSuccessful拡張メソッドとして実装されています(リンクされた記事を参照):

return response != null && response.Status == AuthenticationStatus.Authenticated;

ResponseIntoUserメソッドが入力されると、常に成功します。

   private OpenIdUser ResponseIntoUser(IAuthenticationResponse response)
    {
        OpenIdUser user = null;
        var claimResponseUntrusted = response.GetUntrustedExtension<ClaimsResponse>();
        var claimResponse = response.GetExtension<ClaimsResponse>();

        // For this to work with the newer/est version of DotNetOpenAuth, make sure web.config
        // file contains required settings. See link for more details.
        // http://www.dotnetopenauth.net/developers/help/the-axfetchassregtransform-behavior/

        if (claimResponse != null)
        {
            user = new OpenIdUser(claimResponse, response.ClaimedIdentifier);
        }
        else if (claimResponseUntrusted != null)
        {
            user = new OpenIdUser(claimResponseUntrusted, response.ClaimedIdentifier);
        }
        else
        {
            user = new OpenIdUser("ikke@gmail.com;ikke van ikkenstein;ikke nick;ikkeclaimedid");
        }
        return user;
    }

上記の私のバージョンは、リンクされた記事のコードとは、最後のelseブロックを追加しただけで、ユーザー名とログオフリンクが表示されたホームページを常に取得できるようになっています(これは、これを連続して数回実行しようとするときに役立ちます)。

私はグーグルとヤフーの両方を試しました。どちらも正常に認証され、WebDevサーバーによってログに記録されたIDアサーションを返します。ただし、GetUntrustedExtenstion常にGetExtension nullを返します。私はいつも最後から「ikkenick」を見るようになりますが、実際に認証に使用した名前は決してありません。

私はこれを機能させるためにどのように試み続けるかについて途方に暮れています。それはおそらく私の側の見落としです(私は経験豊富な開発者ですが、C#とWebフロントエンド開発に足を踏み入れ始めたばかりです)、そして私はそれを見ることができません。

これを続行/デバッグする方法に関するすべての提案は大歓迎です。

4

1 に答える 1

0

ソリューションをテストするためのOpenIdプロバイダーとしてGoogleを使用していますか?Googleは、アプリケーションを初めて認証するときにのみクレームを含める習慣があります。それで、おそらく新しいグーグルアカウントを使ってみて、それがうまくいくかどうか確かめてみてください。

応答が遅く、今週クライアントで大規模な移行を行って申し訳ありません:-)この小さなコメントで問題が解決したことをうれしく思います。

于 2013-09-03T15:20:49.973 に答える