User.Claims trống trong ứng dụng MVC


8

Tôi đang làm việc để nâng cấp ứng dụng .NET Core 2.2 MVC lên 3.0. Trong ứng dụng này, tôi đang xác thực bộ điều khiển bằng mã thông báo JWT. Mã thông báo chứa một số khiếu nại, nhưng khi tôi cố gắng truy cập chúng thông qua User.Claimsdanh sách kết quả luôn trống.

Trong tôi Startup.cscó thiết lập xác thực như vậy:

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"
                };
            });
    }
}

Trong Core 2.2, tôi có thể truy cập các khiếu nại của mình bằng mã tương tự như sau:

[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 //
    }
}

Tuy nhiên, khi tôi di chuyển cùng mã sang Core 3.0, tôi xác thực đúng, nhưng tôi không nhận được khiếu nại nào cho Userđối tượng. nhập mô tả hình ảnh ở đây

Tôi đã bỏ lỡ một bước trong việc chuyển đổi này thành 3.0? Không Userđược tự động điền thông tin nữa hay sao?


Bạn có thể xác nhận rằng người dùng được xác thực? Tôi không thể nhìn thấy từ hình ảnh nhưng User.Identity.IsAuthenticatedcó vẻ sai. Nếu vậy, thì điều này có thể phải làm với Xác thựcScheme.
Ruard van Elburg

1
Làm thế nào bạn định cấu hình định tuyến? Bạn đã thêm UseRouting, UseAuthentication và UseAuthorization theo thứ tự đó trước UseEndpoint chưa? Bạn có thể hiển thị đoạn mã đó không?
Ruard van Elburg

@RuardvanElburg Tôi đã chuyển UseEndpointsđến cuối Configurephương thức và những thứ đã được sửa. Chúa ơi, tôi không thể tin được một thứ đơn giản như thế lại khiến tôi mất một khoảng thời gian đáng xấu hổ. Nếu bạn muốn đăng nó như là câu trả lời tôi sẽ chấp nhận nó.
Chris Stillwell

Câu trả lời:


2

Có vẻ như người dùng không được xác thực.

Với định tuyến asp.net core 3.0 đã thay đổi thành định tuyến Endpoint. Bạn có thể từ chối bằng cách cài đặt EnableEndpointRouting = false.

Nhưng dường như không phải vậy. Điều đó có nghĩa là bạn sẽ phải bao gồm một số dịch vụ nhất định khi bạn sử dụng chúng, như xác thực và ủy quyền:

public void Configure(IApplicationBuilder app)
{
  ...

  app.UseStaticFiles();

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

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

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

Và quan trọng nhất, theo thứ tự đó . Như tài liệu ở đây: Di chuyển Startup.Configure .


Để biết thêm thông tin về đơn hàng, xem tài liệu
Ruard van Elburg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.