Làm cách nào để thiết lập xác thực thời gian chạy trong ASP.NET Core?


8

Tôi đang tạo một ứng dụng trong đó có quản lý mô-đun dựa trên vai trò và nó được thay đổi bất cứ lúc nào. Kịch bản:

  • Nếu người dùng có quyền truy cập để tạo và xem Nhân viên thì người dùng chỉ có thể tạo và xem nhân viên nhưng trong tương lai quản trị viên thay đổi vai trò của người dùng từ việc tạo và xem để xem và xóa hơn người dùng chỉ có thể thực hiện hoạt động đó.

Tôi đã thử [Authorize(Roles ="Staff")]nhưng nếu quản trị viên thay đổi thời gian chạy thì nó không được quản lý.

Bất cứ ai có thể nhìn vào điều này và lấy lại cho tôi?


Authorize(Roles ="Staff")đảm bảo rằng người dùng có vai trò Staffchỉ có thể truy cập hành động này ... Vì vậy, nếu người dùng bị xóa khỏi vai trò này, người dùng sẽ không thể truy cập vào điều này .. Điều này có xảy ra không?
Chetan Ranpariya

Theo tôi biết điều này là không thể và có thể không phải là một ý tưởng tốt. Người dùng nên đăng xuất và đăng nhập lại cho các vai trò mới để áp dụng. Bạn thậm chí có thể kết xuất trang khác nhau.
Emad

Giả sử bạn đang sử dụng mã thông báo cookie hoặc jwt mang: các yêu cầu / vai trò của người dùng được duy trì trong cookie / mã thông báo, bạn phải đăng xuất người dùng và đăng nhập lại người dùng để đảm bảo rằng họ nhận được cookie / mã thông báo mới.
itminus

Xin chào, @itminus Hiện tại, giai đoạn ban đầu đang diễn ra nên tại thời điểm người dùng đăng nhập nhận được vai trò và danh sách vai trò khả dụng như Create Employee, View Employeevà @Emad Có Tôi cần thay đổi tại thời điểm đăng nhập nếu có bất kỳ thay đổi nào trong phiên trực tiếp thì không có ảnh hưởng trong một vai trò. Có thể không?
Deep Soni

@DeepSoni chúng tôi có thể triển khai các thuộc tính ủy quyền tùy chỉnh để chúng tôi có thể đạt được yêu cầu này. Xin đề nghị để chúng tôi có thể di chuyển về phía trước.
jishan siddique

Câu trả lời:


1

Đây là một câu hỏi phức tạp và không có câu trả lời đúng nhưng có một số cách để làm điều đó. Trước tiên tôi sẽ cho rằng bạn đang sử dụng auth auth bằng cách sử dụng jwt dựa trên yêu cầu, cách đơn giản nhất là viết Chính sách của riêng bạn để đọc vai trò của người dùng trước mỗi yêu cầu, đây là cách đơn giản nhất để thực hiện và nhanh nhất để thực hiện.

internal class DatabaseRoles : IAuthorizationRequirement
    {
        public string Role { get; }

        public DatabaseRoles(string role)
        {
            Role = role;
        }
    }

    internal class DatabaseRolesHandler : AuthorizationHandler<DatabaseRoles>
    {
        private readonly UserManager<IdentityUser> userManager;

        public DatabaseRolesHandler(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager)
        {
            this.userManager = userManager;
        }

        protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, DatabaseRoles requirement)
        {
            //NOTE this is the out of the box implementation of roles and simple query to get the roles from the EF backed database. I would recoment makeing a custom privelages store for this and not using roles for this but access rights
            var user = await userManager.FindByIdAsync(userManager.GetUserId(context.User));
            if (await userManager.IsInRoleAsync(user, requirement.Role))
            {
                context.Succeed(requirement);
            }
        }

    }

Nhưng giải pháp này không phải là hiệu suất vì nó yêu cầu một cuộc gọi đến cơ sở dữ liệu theo mọi yêu cầu. Điều này tốt trên tải nhỏ nhưng có thể tạo ra vấn đề trong giao thông. Một cách khác là gọi lại tất cả các mã thông báo người dùng khi vai trò thay đổi nhưng điều này siêu phức tạp. Tôi chắc chắn nếu bạn tạo một số cửa hàng truy cập nhanh cho các vai trò như redis, sẽ không có vấn đề gì để thực hiện kiểm tra trên mỗi cuộc gọi. Ngoài ra, tôi không khuyên bạn nên tạo bộ nhớ người dùng của riêng mình vì đó là một cơn ác mộng để duy trì và cập nhật liên quan đến các tiêu chuẩn bảo mật.


Chào, cảm ơn cho câu trả lời của bạn. Tôi đã thử với giải pháp của bạn nhưng tại mỗi quá trình xử lý Index, Tạo, Chỉnh sửa hoặc Bất kỳ thao tác nào khác, phương thức này đang gọi và một vấn đề là Nếu có bảng điều khiển có sẵn công khai thì không có vai trò nào cho mô-đun cụ thể đó. hiển thị cho bất cứ ai theo mã của bạn.
Deep Soni

@DeepSoni Chỉ cần một điều để chỉ ra mã nếu trình diễn sẽ không khuyến nghị sử dụng nó như hiện tại. Bạn nên tùy chỉnh điều này để phù hợp với nhu cầu của bạn. Điểm của điều này là ví dụ về auth dựa trên tài nguyên . Truy vấn sẽ kiểm tra cơ sở dữ liệu của bạn với id người dùng với một truy vấn tùy chỉnh.
Filip Cordas

Cảm ơn vi đa trả lơi. Hãy để tôi thử với tham khảo và giải pháp của bạn.
Deep Soni

Tôi cố gắng hiện tại khi tôi tham chiếu đến Microsoft Doc để ủy quyền dựa trên tài nguyên sau đó IDocumentRepositorykhông thể sử dụng. nó chỉ cho tôi cài đặt UmbracoCMS. Bạn có thể vui lòng tìm ra?
Deep Soni

Vì vậy, đó là câu hỏi cụ thể của UmbracoCMS Tôi thực sự không quen thuộc với nó, tốt nhất nên thêm thẻ UmbracoCMS và mã mà bạn đã cố gắng để ai đó có kinh nghiệm xem xét. Nhưng từ những gì tôi có thể nói nó sẽ hoạt động ở bất cứ đâu miễn là bạn thực hiện truy vấn chính xác tới UmbracoCMS.
Filip Cordas

-1

Nếu bạn đang sử dụng Phiên / Cookie để lưu trữ thông tin người dùng đã đăng nhập, bạn có thể làm trống các chi tiết bất cứ khi nào Quản trị viên thực hiện thay đổi vai trò. Trên mọi hành động, bạn có thể kiểm tra vai trò trong Phiên / Cookie và tiến về phía trước. Bây giờ ngay khi người dùng nhấp vào bất cứ nơi nào trên màn hình chạm vào bộ điều khiển. Điều kiện sẽ được kiểm tra và Người dùng sẽ được đăng xuất vì đối tượng Phiên / Cookie trống.


Xin chào @BansariSoni. Cảm ơn câu trả lời. Nó không có nghĩa là loại bỏ phiên mỗi lần và yêu cầu đăng nhập cho người dùng. Nó chỉ giống như một bản vá (Đã sửa) trong ứng dụng vì vậy cần một số câu trả lời thích hợp thậm chí có thể chấp nhận được hoặc một số gợi ý để tìm ra câu trả lời.
Deep Soni

Nếu vai trò là trong phiên thì theo tôi, tôi chỉ có thể có hai tùy chọn thay đổi biến phiên hoặc loại bỏ nó. Ở đây bạn có thể làm một việc khác như khi quản trị viên thay đổi vai trò, bạn có thể kiểm tra xem userid đó có tồn tại trong phiên hay không nếu có hơn là đặt cờ trong phiên. Sau đó, bạn có thể tạo một công việc định kỳ để làm mới trang cứ sau 5 phút nếu cờ cụ thể này là đúng.
Bansari Soni
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.