MVCアプリケーションでUser.Claimsが空である


8

.NET Core 2.2 MVCアプリケーションを3.0にアップグレードする作業をしています。このアプリケーションでは、JWTトークンを使用してコントローラーを認証しています。トークンにはいくつかのクレームが含まれていますがUser.Claims、結果のリストからそれらにアクセスしようとすると、常に空になります。

私にはStartup.cs私はそうのような認証を設定しています。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Code removed for clarity //

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = JwtManager.Issuer,
                    ValidAudience = "MyAudience",
                    IssuerSigningKey = "MySigningKey"
                };
            });
    }
}

Core 2.2では、次のようなコードを使用してクレームにアクセスできました。

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class MyController : Controller
{
    [HttpGet("MyController/Action")]
    public ActionResult<Aggregate[]> GetAction()
    {
        var username = User.FindFirstValue("MyUsernameClaim");
        if (username == null)
        {
            return Forbid();
        }       
        // Do Stuff //
    }
}

ただし、同じコードをCore 3.0に移行すると、適切に認証されますが、Userオブジェクトに対する要求はありません。 ここに画像の説明を入力してください

これを3.0に変換するステップを逃しましたか?User自動的にもうか何か情報が移入されませ?


ユーザーが認証されていることを確認できますか?画像からは見えませんがUser.Identity.IsAuthenticated間違っているようです。もしそうなら、これはAuthenticationSchemeと関係があるかもしれません。
Ruard van Elburg

1
ルーティングをどのように構成しましたか?UseEndoutsの前に、UseRouting、UseAuthentication、UseAuthorizationの順に追加しましたか?そのコードを見せていただけますか?
Ruard van Elburg

@RuardvanElburg私UseEndpointsConfigureメソッドの最後に移動し、それで問題が修正されました。聖なる牛、こんな単純なものは私に恥ずかしい時間を費やしてしまったとは信じられません。あなたが答えとしてそれを投稿したいなら、私はそれを受け入れます。
Chris Stillwell、

回答:


2

ユーザーがまったく認証されていないようです。

asp.netコア3.0では、ルーティングがエンドポイントルーティングに変更されました。を設定するとオプトアウトできますEnableEndpointRouting = false

しかし、ここではそうではないようです。つまり、認証や承認など、使用するときに特定のサービスを含める必要があります。

public void Configure(IApplicationBuilder app)
{
  ...

  app.UseStaticFiles();

  app.UseRouting();
  app.UseCors();

  app.UseAuthentication();
  app.UseAuthorization();

  app.UseEndpoints(endpoints => {
     endpoints.MapControllers();
  });

そして最も重要なのは、この順序で。ここに記載されているとおり、Migrate Startup.Configure


注文の詳細については、ドキュメントを
Ruard van Elburg '18
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.