認証サーバーとリソースサーバーを分離しようとしています。このチュートリアルで提供されている例に従っています。
これは、認証サーバーの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 Startup
{
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アプリケーションプロジェクトで両方のサーバーを実行していることに注意してください。それが重要かどうかはわかりませんが、それについて言及すると思いました。
前もって感謝します。
私は最後の数日間でまったく同じ問題に直面していましたが、両方のアプリケーションを同じマシン(異なるポート)でホストしていますが、マシンキーとweb.configファイルの両方を追加および確認両方のアプリケーションに同じパッケージバージョン番号がインストールされていること
私はちょうど同じ問題に出会い、解決策を見つけました:
OAuth Token GeneratorおよびOAuth Token Consumer things before WebAPIが登録されています。
これをパイプラインと考えると、一種の理にかなっています。パイプラインでは、コントローラーによる要求処理の前に認証/承認が行われる必要があります。
TL; DR:変更
appBuilder.UseWebApi(config);
this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);
に
this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);
appBuilder.UseWebApi(config);
また、認証サーバーとリソースサーバーを別々に持っているわけではありませんが、「この要求の承認が拒否されました」というエラーメッセージを受け取りました。
私は次のように、NinjectのOwinHostを使用しており、OAuthを構成する前にスタートアップで構成しました。
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
app.UseNinjectMiddleware(() =>
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
return kernel;
}).UseNinjectWebApi(config);
ConfigureOAuth(app);
WebApiConfig.Register(config);
app.UseCors(CorsOptions.AllowAll);
app.UseWebApi(config);
}
Ninject構成を最後に移動すると、次のように問題が解決することがわかりました。
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
ConfigureOAuth(app);
WebApiConfig.Register(config);
app.UseCors(CorsOptions.AllowAll);
app.UseWebApi(config);
app.UseNinjectMiddleware(() =>
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
return kernel;
}).UseNinjectWebApi(config);
}
たぶんあなたの問題はミドルウェアの起動順序に関係しているのでしょう。
私の投稿では、両方のAPI(承認サーバーとリソースサーバー)のmachineKeyノードをオーバーライドし、両方のweb.configファイル間で同じmachineKeyを共有する必要があることは明らかでした。これら2つの異なるプロジェクトをどのようにホストしますか?それらは同じマシン上にありますか、異なるマシン上にありますか?投稿から手順5に戻り、これを達成する方法を確認してください。
私にとって、問題はOwinパッケージのバージョン番号の不一致でした。
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
必要な古いパッケージを更新した後、すべてが魅力のように機能しました。 :)
2018年6月6日更新-最新のWebAPIおよびOWINパッケージを使用。私が認めたい以上に、この問題に頭を打ち続けてきました。 特定のプロジェクトの依存関係を追加すると、突然動作し始めたコードで使用していなかったもの:the Microsoft.Owin.Host.SystemWeb
NuGetパッケージ。このセットアップは、私の好みにはあまりにも細かくてブラックボックス化されています。なぜこのように機能するのかわかりませんが、ここで私がやったことです。
リソースサービスに必要な最小限のセットアップ(認証/トークンサービスは既にセットアップされています):
Microsoft.Owin.Security.Oauth
およびMicrosoft.Owin.Host.SystemWeb
への参照を追加します次のコンテンツを含むstartup.csファイルを作成します。
using Microsoft.Owin;
using Owin;
using Microsoft.Owin.Security.OAuth;
[Assembly: OwinStartup(typeof(MyProject.Startup))]
namespace MyProject
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions{ });
}
}
}
Web.config
セクションの<appSettings>
ファイルに次を追加します
<add key="owin:appStartup" value="MyProject.Startup" />
Web.config
セクションの<system.web>
ファイルにmachineKey
エントリを追加します。生成する必要がある場合は、検索してみてください。それに関する情報はたくさんあります。これを出発点として使用できます: http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/[Authorize]
属性をコントローラー/ルートに追加します。OwinStartupクラスでは、IAppBuilder.UseOAuthBearerTokens()をIAppBuilder.UseWebApi()の前に呼び出す必要があります
public void Configuration(IAppBuilder app)
{
app.UseOAuthBearerTokens(...);
app.UseWebApi(...);
}