OWIN oAuth ミドルウェア (別の認証サーバーとリソースサーバーを使用) を使用すると、「このリクエストの認証が拒否されました」というエラー メッセージが表示されます。質問する

OWIN oAuth ミドルウェア (別の認証サーバーとリソースサーバーを使用) を使用すると、「このリクエストの認証が拒否されました」というエラー メッセージが表示されます。質問する

認証サーバーとリソース サーバーを分離しようとしています。このチュートリアルで提供されている例に従っています。

http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/

これは私の認証サーバーの Startup.cs のコードです:

using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AuthServer.Web
{
   public class xxxxx
   {
      public void Configuration(IAppBuilder app) {
         ConfigureOAuth(app);
      }

      public void ConfigureOAuth(IAppBuilder app)
      {
         OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
         {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = new SimpleAuthorizationServerProvider()
         };

         // Token Generation
         app.UseOAuthAuthorizationServer(OAuthServerOptions);
         app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

      }
   }
}

これは私のリソース サーバー (つまり、サンプル Web API アプリケーション) の startup.cs です。

using Microsoft.Owin.Security.OAuth;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AuthTestApi.Web
{
   public class Startup
   {
      public void Configuration(IAppBuilder app)
      {
         app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
         app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
      }      
   }
}

認証サーバーの「\token」エンドポイントに次のリクエストを送信すると、トークンが正常に受信されます。

{
access_token: "PszrzJUtQUhX42GMryWjZiVHuKiJ9yCVH_1tZURumtC5mTj2tpuRDF3tXcN_VNIYuXY40IG0K7W3KASfJ9DlNIU2jMOkL2U5oEAXLNRRQuNYdEJ7dMPb14nW19JIaM4BMk00xfQ8MFRw0p6-uoh0-e-Q6iAiTwDNN3F7bYMF9qm874qhLWEcOt6dWQgwpdDUVPDi7F07-Ck0zAs48Dg5w4q93vDpFaQMrziJg9aaxN8",
token_type: "bearer",
expires_in: 86399
}

次のリクエストをコントローラーに送信すると、「このリクエストの承認が拒否されました」というエラー メッセージが表示されます。

GET /api/Test HTTP/1.1
Host: localhost:63305
Accept: application/json
Content-Type: application/json
Authorization: Bearer PszrzJUtQUhX42GMryWjZiVHuKiJ9yCVH_1tZURumtC5mTj2tpuRDF3tXcN_VNIYuXY40IG0K7W3KASfJ9DlNIU2jMOkL2U5oEAXLNRRQuNYdEJ7dMPb14nW19JIaM4BMk00xfQ8MFRw0p6-uoh0-e-Q6iAiTwDNN3F7bYMF9qm874qhLWEcOt6dWQgwpdDUVPDi7F07-Ck0zAs48Dg5w4q93vDpFaQMrziJg9aaxN8
Cache-Control: no-cache
Postman-Token: aeca8515-70b1-ef2c-f317-bf66136dccab

私の認証サーバーとリソース/Web API プロジェクトは異なるソリューションにあり、異なるポートで実行されています (...それが重要かどうかはわかりませんが、言及しておこうと思いました)。

現時点では、これら 2 つのプロジェクトは oAuth OWIN ミドルウェアを使用しています (カスタム コードはほとんどありません)。ミドルウェアはややブラックボックスなので、このエラー メッセージが表示される理由を理解するために支援が必要です。

また、異なるポートで実行されている異なる VS 2013 ソリューションにある 2 つの Visual Studio 2013 Web アプリケーション プロジェクトで両方のサーバーを実行していることにも注意してください。これが重要かどうかはわかりませんが、言及しておこうと思いました。

前もって感謝します。

ベストアンサー1

私はちょうど同じ問題に遭遇し、解決策を見つけました:

OAuthトークンジェネレーターとOAuthトークンコンシューマーを登録する必要があります前にWebAPIが登録されました。

これをパイプラインとして考えれば、認証/承認はコントローラーによるリクエスト処理の前に行われるべきであることがわかります。

TL;DR: 変更

appBuilder.UseWebApi(config);

this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);

this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);

appBuilder.UseWebApi(config);

おすすめ記事