C# cơ bản .NET Core

Bài này tiếp tục thực hành, phát triển trên dự án của ví dụ Album trước: Authorize chứng thực quyền truy cập theo Role

Sử dụng chứng thực quyền theo chính sách Policy-based authorization

Chứng thực quyề theo chính sách là bạn tạo ra chính sách (policy) - trong chính sách đó có các yêu cầu, nếu User đảm bảo các yêu cầu thì có quyền truy cập tài nguyên.

Asp.net core Identity sử dụng dịch vụ IAuthorizationService để thực hiện xác thực theo chính sách.

Bạn cần tạo ra các chính sách bằng cách cấu hình dịch vụ IAuthorizationService trong phương thức Startup.ConfigureServices - qua đó tạo ra các policy - chính sách.

Đoạn mã để bạn cấu hình có dạng:

public void ConfigureServices(IServiceCollection services)
{
    /... các loại cấu hình khác

    //  Tạo ra Policy có tên MyPolicy1 - những User có Role là Vip thì thỏa mãn policy này
    options.AddPolicy("MyPolicy1", policy => {
        // policy kiểu AuthorizationPolicyBuilder, có các phương thức để thêm yêu cầu như:
        // RequireClaim - User phải có Claim nào đó
        // RequireRole  - User phải có Role nào đó
        // RequireUserName - User phải có tên chỉ ra
        // AddRequirements ...
        policy.RequireRole("Vip");
    });

    // options.AddPolicy ... tiếp tục tạo ra các Policy khác
}

Ví dụ: Tạo ra policy - đặt tên là CanViewTest, yêu cầu là các User phải có Role là VipMember hoặc Editor

services.AddAuthorization(options =>
{

    options.AddPolicy("MyPolicy1", policy => {
        policy.RequireRole("Vip");
    });

    options.AddPolicy("CanViewTest", policy => {
        policy.RequireRole("VipMember", "Editor");
    });
});

Để chứng thực theo Policy trong các Controller, Action, PageModel vẫn sử dụng thuộc tính [Authorize] với cú pháp như sau:

[Authorize(Policy="NamePolicy")]

Hoặc viết ngắn gọn hơn

[Authorize("NamePolicy")]

Thử áp dụng vào Page: TestAuthorize1.cshtml (mã nguồn ví dụ)

[Authorize(Policy="CanViewTest")]
public class TestAuthorize1Model : PageModel
{
}

Truy cập địa chỉ trang này /test-authorize-1, nếu User thuộc nhóm có Role bằng Vip hoặc Editor sẽ được truy cập, nếu không bị cấm.

Sử dụng chứng thực quyền theo chính sách Policy-based authorization dùng IdentityRoleClaim

Các Role trong ASP.NET Identity còn được bổ sung các thông tin, các thông tin này là cách mô tả chi tiết hơn về một Role, chúng được gọi là các Claim. Với Role mỗi mẩu thông tin này có kiểu IdentityRoleClaim - nó lưu vào CSDL ở bảng RoleClaims - nó lưu thông tin gồm hai trường (kiểu string - nvarchar) có tên là ClaimType và ClaimValue

Bạn có thể mô tả bất kỳ thông tin gì với định dạng key/value để cho biết thông tin về Role, điều này nó cũng giống như bảng UserClaims - lưu thông tin bổ sung về User

Ví dụ, để mô tả thông tin về Role Admin bạn có thể chèn thêm các IdentityRoleClaim với ClaimType và ClaimValue như:

  • permission : user.create
  • permission : user.update
  • permission : user.view
  • ...

Bạn có thể xây dựng các trang với chức năng - biên tập RoleClaim của các Role. Trong mã nguồn tham khảo có tạo ra các trang để quản lý RoleClaim, bạn có thể lấy các trang Razor Page này đưa vào code ở /Areas/Admin/Pages/RoleClaims: source code

Các RoleClaim còn được dùng để thực hiện chứng thực quyền một cách chi tiết của User. Ví dụ, nếu User có IdentityRoleclaim nào đó thì được thực hiện tác vụ ...

Bạn hãy chạy ứng dụng, thêm các RoleClaim vào Role Editor, các role này là:

  • permission : post.create - cho biết có quyền tạo bài
  • permission : post.update - cho biết có quyền cập nhật
  • permission : post.view

Tạo ra một policy CanView, chứng thực được phép nếu User đó có roleclaim permission với giá trị post.view

options.AddPolicy("CanView", policy => {
    // policy.RequireRole("Editor");
    policy.RequireClaim("permision", "post.view");
});

Lúc này trong code, nếu bạn dùng

[Authorize(Policy="CanView")]
public class TestAuthorize1Model : PageModel
{
}

Thì những User nào có roleclaim permision với giá trị post.view được truy cập trang TestAuthorize1, nếu không có sẽ bị cấm

Tham khảo code ASP_NET_CORE/Album


Đăng ký nhận bài viết mới