[Authorize]
で保護されたAspNetCoreコントローラーでBearerトークンを使用すると、次のログメッセージが表示されます。
info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler[7]
Identity.Application was not authenticated. Failure message: Unprotect ticket failed
私はこれが何を意味し、何がこれを引き起こしているのかを理解しようとしています。
ApiのStartup
クラスは次のように設定されています。 ApiはAspNetIdentityCoreを使用します。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<UserAccountDbContext>(options => options.UseSqlServer(connectionString,
sql => sql.MigrationsAssembly(MigrationsAssembly)));
services.AddIdentity<UserAccount, IdentityRole>()
.AddEntityFrameworkStores<UserAccountDbContext>();
services.AddTransient<UserManager<UserAccount>>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddAuthorization();
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = _configuration.OAuth2.ServerUri;
options.RequireHttpsMetadata = false;
options.Audience = "api";
});
}
そして:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();
app.UseMvc();
}
発信者への応答は、説明なしで無許可(401)です。
編集:
コメントが示唆しているように、これはクッキーと関係があると思います。クッキーIdentity.Application
が表示されます。私はこれをクリアして試しましたが、役に立ちませんでした。これは、トークンサーバーとApiサーバーのセットアップ方法(どちらもAspNet Identityを使用している)と関係があると思います。
Localhost:5000でIdpとして実行されているMvcプロジェクトが1つあります。次に、保護されたコントローラーを持つユーザーマネージャーのApiがlocalhost:5001でホストされます。保護されたコントローラーにアクセスしようとすると、IdPプロジェクトのログインページにリダイレクトされます(これがCookieを設定するものだと思います)。次に、コントローラーでトークンを使用しようとすると、上記のエラーが発生します。
トークンを取得してからApi呼び出しを行うまでの間にCookieを削除すると、次のログが表示されます。
2019-02-11 23:35:15.3711 [INFO] Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
Executing ChallengeResult with authentication schemes ().
2019-02-11 23:35:15.3711 [INFO] Executing ChallengeResult with authentication schemes ().
info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler[12]
AuthenticationScheme: Identity.Application was challenged.
2019-02-11 23:35:15.3711 [INFO] AuthenticationScheme: Identity.Application was challenged.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
これを解決するために何をしたのか正確には思い出せません。そして、久しぶりに答えがわかりません。基本的に、私は多くのIdentityServer4の例とMicrosoftのドキュメントを調べ、以下をまとめました。それが機能するかどうかを確認します。
services.AddAuthentication(options => options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.Audience = "api";
});
の代わりに:
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = _configuration.OAuth2.ServerUri;
options.RequireHttpsMetadata = false;
options.Audience = "api";
});
ポート5000で開発サーバーを起動すると、「チケットの保護を解除できませんでした」というエラーメッセージも表示されます。 Chromeで、5000で実行された別のプロジェクトからいくつかのCookieがありました。すべてのCookieを削除し、エラーメッセージが消えました。