Phần mềm trung gian xác thực ASP.NET Core 2.0


89

Với Core 1.1 đã làm theo lời khuyên của @ blowdart và triển khai phần mềm trung gian tùy chỉnh:

https://stackoverflow.com/a/31465227/29821

Nó hoạt động như thế này:

  1. Phần mềm trung gian đã chạy. Nhận mã thông báo từ tiêu đề yêu cầu.
  2. Đã xác minh mã thông báo và nếu hợp lệ sẽ xây dựng một danh tính (ClaimsIdentity) chứa nhiều xác nhận quyền sở hữu mà sau đó nó được thêm qua HttpContext.User.AddIdentity ();
  3. Trong ConfigureServices using services.AddAuthorization, tôi đã thêm chính sách yêu cầu xác nhận quyền sở hữu do phần mềm trung gian cung cấp.
  4. Trong bộ điều khiển / hành động, sau đó tôi sẽ sử dụng [Authorize (Roles = "một số vai trò mà phần mềm trung gian đã thêm")]

Điều này phần nào hoạt động với 2.0, ngoại trừ việc nếu mã thông báo không hợp lệ (bước 2 ở trên) và yêu cầu không bao giờ được thêm vào, tôi nhận được "Không có xác thựcScheme được chỉ định và không tìm thấy DefaultChallengeScheme."

Vì vậy, bây giờ tôi đang đọc rằng auth đã thay đổi trong 2.0:

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x

Con đường phù hợp để tôi làm điều tương tự trong ASP.NET Core 2.0 là gì? Tôi không thấy một ví dụ nào để thực hiện xác thực tùy chỉnh.


Hãy thử liên kết này, mặc dù nó nói 2 chương trình nhưng nó sẽ cung cấp cho u đứng lên trên xác thực wildermuth.com/2017/08/19/...
Mithun Pattankar

bạn có thể thêm mã của bạn để chúng tôi có thể xem xét? Tôi biết tôi đã có vấn đề với JWT trong core2.0 - là một trường hợp di chuyển nó xung quanh trong khi khởi động
Webezine

Câu trả lời:


194

Vì vậy, sau một ngày dài cố gắng giải quyết vấn đề này, cuối cùng tôi đã tìm ra cách Microsoft muốn chúng tôi tạo các trình xử lý xác thực tùy chỉnh cho thiết lập phần mềm trung gian mới của họ trong lõi 2.0.

Sau khi xem qua một số tài liệu về MSDN, tôi đã tìm thấy một lớp được gọi là AuthenticationHandler<TOption>thực thi IAuthenticationHandlergiao diện.

Từ đó, tôi đã tìm thấy toàn bộ cơ sở mã với các lược đồ xác thực hiện có tại https://github.com/aspnet/Security

Bên trong một trong số này, nó cho thấy cách Microsoft triển khai lược đồ xác thực JwtBearer. ( https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer )

Tôi đã sao chép hầu hết mã đó vào một thư mục mới và xóa tất cả những thứ phải làm JwtBearer.

Trong JwtBearerHandlerlớp (mở rộng AuthenticationHandler<>), có một ghi đè choTask<AuthenticateResult> HandleAuthenticateAsync()

Tôi đã thêm vào phần mềm trung gian cũ của chúng tôi để thiết lập xác nhận quyền sở hữu thông qua máy chủ mã thông báo tùy chỉnh và vẫn gặp phải một số vấn đề với quyền, chỉ xuất hiện 200 OKthay vì 401 Unauthorizedmã khi mã thông báo không hợp lệ và không có xác nhận quyền sở hữu nào được thiết lập.

Tôi nhận ra rằng tôi đã ghi đè Task HandleChallengeAsync(AuthenticationProperties properties)mà vì bất kỳ lý do gì được sử dụng để đặt quyền qua [Authorize(Roles="")]bộ điều khiển.

Sau khi loại bỏ ghi đè này, mã đã hoạt động và đã ném thành công 401khi các quyền không khớp.

Điều rút ra chính là bây giờ bạn không thể sử dụng phần mềm trung gian tùy chỉnh, bạn phải triển khai nó thông qua AuthenticationHandler<>và bạn phải đặt DefaultAuthenticateSchemeDefaultChallengeSchemekhi sử dụng services.AddAuthentication(...).

Dưới đây là một ví dụ về tất cả những gì điều này sẽ trông như thế nào:

Trong Startup.cs / ConfigureServices () thêm:

services.AddAuthentication(options =>
{
    // the scheme name has to match the value we're going to use in AuthenticationBuilder.AddScheme(...)
    options.DefaultAuthenticateScheme = "Custom Scheme";
    options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });

Trong Startup.cs / Configure () thêm:

app.UseAuthentication();

Tạo một tệp mới CustomAuthExtensions.cs

public static class CustomAuthExtensions
{
    public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
    {
        return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
    }
}

Tạo một tệp mới CustomAuthOptions.cs

public class CustomAuthOptions: AuthenticationSchemeOptions
{
    public CustomAuthOptions()
    {

    }
}

Tạo một tệp mới CustomAuthHandler.cs

internal class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
    public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
    {
        // store custom services here...
    }
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // build the claims and put them in "Context"; you need to import the Microsoft.AspNetCore.Authentication package
        return AuthenticateResult.NoResult();
    }
}

1
bài đăng tuyệt vời, nhưng tôi gặp một số vấn đề khi biên dịch mã của bạn. Thiếu loại CustomAuthOptions và AuthenticateResult. Bạn có thể đăng những cái đó không?
alexb

8
Bạn có sẵn sàng chia sẻ kết luận của mình bằng mã trên repo Github không?
CSharper

2
Bạn có thể vui lòng giải thích DefaultAuthenticateSchemeDefaultChallengeScheme? Tôi không hiểu tại sao cả hai đều được sử dụng? và sự khác biệt giữa chúng là gì.
Mohammed Noureldin

11
+1 cho "Từ đó, tôi đã tìm thấy toàn bộ cơ sở mã với các lược đồ xác thực hiện có tại github.com/aspnet/Security ." Chỉ cần nhìn vào cách nhóm ASP.NET làm điều đó khi bạn làm theo cùng với câu trả lời (thực sự xuất sắc) này. Có ai trong chúng ta từng nghĩ rằng một ngày nào đó chúng ta sẽ hỏi những câu hỏi về mã và thực hành MS và câu trả lời sẽ là, "chỉ cần nhìn vào cơ sở mã của họ?"
Marc L.

3
Đối với những người khác đến sau, bạn AuthExtensioncần phải ở bên trong Microsoft.Extensions.DependencyInjectionkhông gian tên. Xem ví dụ này: github.com/aspnet/Security/blob/rel/2.0.0/src/…
Garry Polley

4

Có những thay đổi đáng kể trong Identity từ Core 1.x sang Core 2.0 như bài viết bạn tham khảo đã chỉ ra. Thay đổi lớn là thoát khỏi phương pháp tiếp cận phần mềm trung gian và sử dụng tiêm phụ thuộc để định cấu hình các dịch vụ tùy chỉnh. Điều này mang lại sự linh hoạt hơn rất nhiều trong việc tùy chỉnh Identity cho các triển khai phức tạp hơn. Vì vậy, bạn muốn thoát khỏi cách tiếp cận phần mềm trung gian mà bạn đề cập ở trên và chuyển sang các dịch vụ. Thực hiện theo các bước di chuyển trong bài viết được tham khảo để đạt được mục tiêu này. Bắt đầu bằng cách thay thế app.UseIdentity bằng app.UseAuthentication . UseIdentity bị giảm giá trị và sẽ không được hỗ trợ trong các phiên bản sau. Để có ví dụ đầy đủ về cách chèn chuyển đổi xác nhận quyền sở hữu tùy chỉnh và thực hiện ủy quyền đối với xác nhận quyền sở hữuxem bài đăng trên blog này .


12
Có ví dụ về cách sử dụng điều này với ứng dụng WebAPI không?
alexb
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.