1

したがって、これは「間違っています」の下に提出する必要があるかもしれませんが、デフォルトの VS2013 MVC5/WebApi プロジェクト テンプレートによって返された OAuth access_token を取得して、WebApi 要求を正常に認証することはできません。興味深いことに、VS2013 SPA プロジェクト テンプレートは正常に機能しているようです。

これは、次の手順で再現できるはずです。

  1. VS2013 では、[ファイル] -> [新しいプロジェクト] -> [Web] -> [単一ページ アプリケーション] を実行します。
  2. Startup.Auth.cs で、次の行のコメントを外します。

    app.UseGoogleAuthentication();
    
  3. 新しい WebApi コントローラーと GET アクションを作成してデータを返し、コントローラーに [Authorize] 属性を追加します。

  4. Fiddler を起動し、F5 キーを押してアプリケーションをデバッグし、次の場所を参照します。

    http://localhost:<your_port>/api/account/ExternalLogins?returnUrl=%2F&generateState=true
    
  5. 手順 4 で返された json ファイルを開き、URL 値全体 (先頭の "/" を除く) をコピーしてアドレス バーのアドレスの末尾に貼り付け、Enter キーを押します。認証のために Google に移動する必要があります。
  6. 認証が完了すると、SPA アプリにリダイレクトされます。「外部ログインに失敗しました」は無視してください。エラーメッセージ。
  7. Google で認証した後、アプリへの最初のリクエストの Fiddler トレースを確認します。そのリクエストを強調表示し、[Inspectors] タブをクリックして、レスポンスのヘッダーを表示します。
  8. Transport セクションの下の Location ヘッダーをコピーしてメモ帳に貼り付け、access_token フラグメントの値のみをコピーします。
  9. Fiddler で [Composer] タブをクリックし、既定の URL を変更して、上記の手順 3 で作成したコントローラー アクションの URL にします。
  10. Request Headers 領域で、User-Agent ヘッダーの下に以下を追加します。

    Authorization: Bearer [access_token]
    

    [access_token] は、上記の手順 8 からコピーした値です。

  11. リクエストを実行すると、Fiddler トレースに HTTP 200 が表示されます。[Inspectors] タブで Raw レスポンスを表示すると、WebApi メソッドから返された値が表示されます。

上記の手順 1 ~ 11 に従って、認証の種類として個別のユーザー アカウントを使用する MVC/WebApi を選択することのみを変更すると、手順 11 で HTTP 200 ではなく HTTP 401 が返され、適切な戻りデータが返されます。

そうは言っても、私のやり方は間違っていますか?私が知る限り、2 つのプロジェクト テンプレートは、OAuth/セキュリティの設定に関してはほぼ同じです (web.config にいくつかの小さな違いがありますが、それらを変更しても違いはないようです)。

あなたが提供できる助けを前もって感謝します-私は過去数晩、机に頭をぶつけていました...

ライアン

4

1 に答える 1

0

私の場合、WebAPI でベアラー トークンを使用できるようにする必要がありました。そうしないと、常に 401 が返されます。WebAPI は、メインの MVC/Owin アプリ構成と並行して構成されます。config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));WebApiConfig.csの行で問題が修正されました。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.SuppressDefaultHostAuthentication();

        // Configure Web API to use only bearer token authentication.
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // Web API routes
        config.MapHttpAttributeRoutes();
        ...
    }
}

これにより、WebApi は Owin のベアラー トークン認証を介して認証されます。

于 2015-01-05T19:28:50.290 に答える