web-dev-qa-db-ja.com

Asp.Net CoreWebApiの「チケットの保護解除に失敗しました」で認証が失敗する

[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]
3
kovac

これを解決するために何をしたのか正確には思い出せません。そして、久しぶりに答えがわかりません。基本的に、私は多くの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";
                                            });
2
kovac

ポート5000で開発サーバーを起動すると、「チケットの保護を解除できませんでした」というエラーメッセージも表示されます。 Chromeで、5000で実行された別のプロジェクトからいくつかのCookieがありました。すべてのCookieを削除し、エラーメッセージが消えました。

0
Merijn