3

GoogleハイブリッドOpenID+OAuth(フェデレーションログイン)を使用してユーザーログインを実装する方法を理解するために、過去2日間でおそらく10時間以上を費やしました。

私が使用する承認リクエストをトリガーするには:

InMemoryOAuthTokenManager tm = new InMemoryOAuthTokenManager( ConfigurationManager.AppSettings["googleConsumerKey"], ConfigurationManager.AppSettings["googleConsumerSecret"]);
using (OpenIdRelyingParty openid = new OpenIdRelyingParty())
{
  Realm realm = HttpContext.Current.Request.Url.Scheme + Uri.SchemeDelimiter + ConfigurationManager.AppSettings["googleConsumerKey"] + "/";
  IAuthenticationRequest request = openid.CreateRequest(identifier, Realm.AutoDetect, new Uri(HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + "/OAuth/google"));

  var authorizationRequest = new AuthorizationRequest
  {
    Consumer = ConfigurationManager.AppSettings["googleConsumerKey"],
    Scope = "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/plus.me",
  };

  request.AddExtension(authorizationRequest);

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

  request.RedirectToProvider();
}

アクセストークンを取得するには、次を使用します。

using (OpenIdRelyingParty openid = new OpenIdRelyingParty())
{
  IAuthenticationResponse authResponse = openid.GetResponse();
  if (authResponse != null)
  {
    switch (authResponse.Status)
    {
      case AuthenticationStatus.Authenticated:
        HttpContext.Current.Trace.Write("AuthenticationStatus", "Authenticated");
        FetchResponse fr = authResponse.GetExtension<FetchResponse>();

        InMemoryOAuthTokenManager tm = new InMemoryOAuthTokenManager(ConfigurationManager.AppSettings["googleConsumerKey"], ConfigurationManager.AppSettings["googleConsumerSecret"]);

        ServiceProviderDescription spd = new ServiceProviderDescription {
          spd.RequestTokenEndpoint = new DotNetOpenAuth.Messaging.MessageReceivingEndpoint("https://accounts.google.com/o/oauth2/token", HttpDeliveryMethods.AuthorizationHeaderRequest | HttpDeliveryMethods.GetRequest);
          spd.AccessTokenEndpoint = new DotNetOpenAuth.Messaging.MessageReceivingEndpoint("https://accounts.google.com/o/oauth2/token", HttpDeliveryMethods.AuthorizationHeaderRequest | HttpDeliveryMethods.GetRequest);
          spd.UserAuthorizationEndpoint = new DotNetOpenAuth.Messaging.MessageReceivingEndpoint("https://accounts.google.com/o/oauth2/auth?access_type=offline", HttpDeliveryMethods.AuthorizationHeaderRequest | HttpDeliveryMethods.GetRequest);
          spd.TamperProtectionElements = new ITamperProtectionChannelBindingElement[] { new HmacSha1SigningBindingElement() };

        WebConsumer wc = new WebConsumer(spd, tm);
        AuthorizedTokenResponse accessToken = wc.ProcessUserAuthorization();

        if (accessToken != null)
        {
          HttpContext.Current.Trace.Write("accessToken", accessToken.ToString());
        }
        else
        {
        }
        break;
      case AuthenticationStatus.Canceled:
        HttpContext.Current.Trace.Write("AuthenticationStatus", "Canceled");
        break;
      case AuthenticationStatus.Failed:
        HttpContext.Current.Trace.Write("AuthenticationStatus", "Failed");
        break;
      default:
        break;
    }
  }
}

残念ながら私は得ますAuthenticationStatus.Authenticatedwc.ProcessUserAuthorization()ですnull

私は何が間違っているのですか?

助けてくれてありがとう。

4

1 に答える 1

1

を使用する代わりに、 DotNetOpenAuth.OpenIdOAuth NuGet パッケージで利用可能なクラスをWebConsumer使用します。このクラスは、OAuth リクエストを OpenID 拡張機能としてアタッチするためのヘルパー メソッドを提供し (これは、自分自身にとってはかなりうまくいきました)、戻る途中で OpenID 拡張機能の応答を抽出するためのものです。WebConsumerOpenIdRelyingParty

上記のクラスのソース コードを見ると、ヒントが得られるかもしれません。Google OpenID ログインと DotNetOpenAuth の OAuth 拡張に特化したサンプルもあります。 SourceForge からサンプルを取得し、OpenIdRelyingPartyWebForms サンプル プロジェクトの loginPlusOAuth.aspx ページ (およびコード ビハインドとサポート クラス) を調べます。

于 2012-10-25T05:45:08.987 に答える