2016-09-11 3 views
3

ベアラトークンを使用してバッキングAPIで認証するように設計された静的にサービスされるクライアントページであるアプリケーションを設計していますが、ソーシャル・ログイン・オプションをバックエンドに提供していますが、MVC依存性を使用しないサンプルを見つけるのは非常に困難です。ソーシャルログインとMVC依存関係のないASP.NET WebAPI 2.2 SPA

:私は基本的に私は彼がこのような OAuthAuthorizationServerOptions.AuthorizeEndpointPathを設定した参照質問に、同じマナーで動作するように私のプロジェクトを取得するために苦労してきたが ASP.NET Web API social authentication for Web and Mobile

この質問は、始めるための大きな助けでした

[OverrideAuthentication] 
     [HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)] 
     [AllowAnonymous] 
     [Route("ExternalLogin", Name = "ExternalLogin")] 
     public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null) 

:彼は次のアクションを持っている彼のバッキングAPIアカウントのコントローラでも

OAuthOptions = new OAuthAuthorizationServerOptions 
      { 
       TokenEndpointPath = new PathString("/token"), 
       Provider = new ApplicationOAuthProvider(PublicClientId), 
       AuthorizeEndpointPath = new PathString("/api/account/externallogin"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
       //AllowInsecureHttp = false 
      }; 

この例では、RouteAttribute(テンプレート)の最初のパラメータが実際にプロジェクトで参照しているものが何であれ、この文脈で何をしているのかを説明することができたのですか?

「api/Account/ExternalLogin」にGETリクエストを送信する質問で提供されているサンプルプロジェクトを実行すると、リクエストはAPIアカウントコントローラのアクションで処理されますが、これはOverrideAuthenticationここで私の奥深さから少しを得て、この属性の他の用途の強力な例を見つけるのに苦労しています。

しかし私は自分のWebAPIプロジェクトを彼が記述した方法で正しく構成していると確信していますが、OAuthAuthorizationServerOptions.AuthorizeEndpointPathにGETリクエストを送信するとAPIのアカウントコントローラではなく、代わりにOAuthAuthorizationServerProvider 'invalid_request'エラーです。

APIアカウントコントローラの操作を無視して無視される可能性のあるものは誰でも考えられますか?

また、私はこの記事を読んでましたが、WebAPIの古いバージョンで書かれているようだ:任意の助け https://thompsonhomero.wordpress.com/2015/01/21/creating-a-clean-web-api-2-project-with-external-authentication-part-2/

おかげで、 アレックス。

+1

'api/Account/ExternalLogin'へのGETリクエストを行う際にメソッドを入力できますか? –

+0

いいえ、常に 'ApplicationOAuthProvider'によって処理されます。 –

+1

'api/account'として宣言されているアカウントコントローラでRoutePrefixを使用していますか? Route属性では、apiアカウントコントローラメソッドの上に、ルートを '/ ExternalLogin'として宣言します。しかし、AuthorizeEndpointPath '/ api/account/externallogin'にあります。あなたがRouteprefixを使用しない場合は、AuthorizeEndpointPathのルートを '/ ExternalLogin'に変更してください –

答えて

3

GETリクエストが実際に表示されていない場合は、OAuthプロバイダが期待していないことしか想定できません。

プロバイダーは、最初に行われた要求を検証します。THENエンドポイントのコントローラーにコントロールを渡します。あなたのコードは正しい可能性が高いです。リクエストが不正です。

私は新しいプロジェクトを作成し、AuthorizeEndpointPathへのリクエストを作成することで、あなたが記述した問題を再現することができました。残念ながら、ソースを逆コンパイルしたり、ソースを見つけることができれば、ここで何が起こっているのかを知ることができます。

は逆コンパイルはApplicationOAuthProvider.ValidateClientRedirectUriの呼び出し元のコードは、私が取得:

await this.Options.Provider.ValidateClientRedirectUri(clientContext); 
    if (!clientContext.IsValidated) 
    { 
    LoggerExtensions.WriteVerbose(this._logger, "Unable to validate client information"); 
    flag = await this.SendErrorRedirectAsync(clientContext, (BaseValidatingContext<OAuthAuthorizationServerOptions>) clientContext); 
    } 
    else 
    { 
    OAuthValidateAuthorizeRequestContext validatingContext = new OAuthValidateAuthorizeRequestContext(this.Context, this.Options, authorizeRequest, clientContext); 
    if (string.IsNullOrEmpty(authorizeRequest.ResponseType)) 
    { 
     LoggerExtensions.WriteVerbose(this._logger, "Authorize endpoint request missing required response_type parameter"); 
     validatingContext.SetError("invalid_request"); 
    } 
    else if (!authorizeRequest.IsAuthorizationCodeGrantType && !authorizeRequest.IsImplicitGrantType) 
    { 
     LoggerExtensions.WriteVerbose(this._logger, "Authorize endpoint request contains unsupported response_type parameter"); 
     validatingContext.SetError("unsupported_response_type"); 
    } 
    else 
     await this.Options.Provider.ValidateAuthorizeRequest(validatingContext); 
    if (!validatingContext.IsValidated) 
    { 
     flag = await this.SendErrorRedirectAsync(clientContext, (BaseValidatingContext<OAuthAuthorizationServerOptions>) validatingContext); 
    } 
    else 
    { 
     this._clientContext = clientContext; 
     this._authorizeEndpointRequest = authorizeRequest; 
     OAuthAuthorizeEndpointContext authorizeEndpointContext = new OAuthAuthorizeEndpointContext(this.Context, this.Options, authorizeRequest); 
     await this.Options.Provider.AuthorizeEndpoint(authorizeEndpointContext); 
     flag = authorizeEndpointContext.IsRequestCompleted; 
    } 
    } 

このコードでは、あなたは要求が検証されたとResponseTypeを指定されたリクエストのが用意されていない場合、それは文脈の誤りだ設定されていることを見ることができますに "無効なリクエスト"。

私は成功し、次のリクエストURIを使用してExternalLoginコントローラメソッドに通過する要求を取得することができた:

http://localhost:18086/api/Account/ExternalLogin?provider=none&client_id=self&redirect_uri=http://localhost:18086/&response_type=token` 

P.S.コントローラのroute属性に関しては、 "template"フィールドは、要求をルーティングする場所を決定するために着信要求URIを照合するためのテンプレートとして使用される文字列を指定します。

P.P.S.デコンパイルされたスニペットの実際のソースコードは見つかりませんでしたhere

+0

こんにちは、これは私が必要とした情報だと確信していますが、この問題に回帰することができませんでした非常に有益な答えはありがとうございます。 –

関連する問題