7

Tôi đang viết một hệ thống lưu trữ tệp ví dụ (ví dụ: chỉ cho stackoverflow).Xác nhận quyền sở hữu đối với các tài nguyên cụ thể

mô hình miền hiện tại của tôi trông như thế:

public class User 
{ 
    public int ID { get; set; } 
    public string LoginIdentifier { get; set; } 
    public string Password { get; set; } 
} 

public class File 
{ 
    public int ID { get; set; } 
    public int UserID { get; set; } 
    public string FileName { get; set; } 
    public byte[] Data { get; set; } 
} 

Mã Tôi viết thư này để tạo ra các IPrincipal:

private static IPrincipal CreatePrincipal(User user) 
{ 
    Debug.Assert(user != null); 

    var identity = new GenericIdentity(user.LoginIdentifier, "Basic"); 

    // TODO: add claims 
      identity.AddClaim(new Claim("Files", "Add")); 

    return new GenericPrincipal(identity, new[] { "User" }); 
} 

Trong hệ thống của tôi, người dùng có thể thêm các tập tin, họ cũng có thể lấy , xóa và cập nhật chúng, tuy nhiên, hãy báo trước rằng người dùng chỉ có thể truy xuất và sửa đổi tệp của riêng họ (trong đó File.UserID phải khớp với danh tính của người dùng đã đăng nhập).

Trình điều khiển tệp của tôi trông như sau.

[Authorize] 
public class FilesController : ApiController 
{ 
    private readonly FileRepository _fileRepository = new FileRepository(); 

    public void Post(File file) 
    { 
     // not sure what to do here (...pseudo code...) 
     if (!CheckClaim("Files", "Add")) 
     { 
      throw new HttpError(HttpStatusCode.Forbidden); 
     } 

     // ... add the file 
     file.UserID = CurrentPrincipal.UserID; // more pseudo code... 

     _fileRepository.Add(file); 
    } 

    public File Get(int id) 
    { 
     var file = _fileRepository.Get(id); 

     // not sure what to do here (...pseudo code...) 
     if (!CheckClaim("UserID", file.UserID)) 
     { 
      throw new HttpError(HttpStatusCode.Forbidden); 
     } 

     return file; 
    } 
} 

Có thể sử dụng Claim s không phải là công cụ thích hợp cho công việc, nhưng hy vọng này minh họa các vấn đề.

Tôi nên kết nối bộ điều khiển của mình như thế nào để đảm bảo người dùng hiện đã đăng nhập có quyền truy cập để thực hiện các hành động cụ thể và cụ thể hơn, một số tài nguyên nhất định?

Trả lời

5

Tôi không chắc liệu xác nhận quyền sở hữu có phải là cách tiếp cận phù hợp với những gì bạn đang làm hay không. Những gì bạn thực sự muốn đại diện là quyền. Yêu cầu thường đại diện cho thuộc tính nhận dạng như tên người dùng, email hoặc vai trò thuộc tính, nhưng không phải là quyền. Bạn có thể đại diện cho các quyền với các xác nhận quyền sở hữu, nhưng bạn có thể cần tấn nó tùy thuộc vào ứng dụng của bạn lớn tới mức nào. Một cách tiếp cận điển hình là ánh xạ vai trò cho một tập hợp các quyền (trong trường hợp của bạn, thêm tệp sẽ là quyền). Bạn cũng có thể tạo một bộ lọc Authorization tùy chỉnh xuất phát từ AuthorizeAttribute để kiểm tra xem hiệu trưởng hiện tại có quyền thích hợp để thực thi hành động hay không. Bộ lọc đó có thể nhận các quyền cần thiết để thực thi hành động dưới dạng đối số.

+0

trong trường hợp này, tôi nghĩ rằng yêu cầu bồi thường sẽ là 'UserID'. – Matthew

+0

Vâng, điều đó có ý nghĩa. Bạn cũng có thể có xác nhận quyền sở hữu để thể hiện vai trò người dùng. Sau đó, bạn ánh xạ vai trò cho một tập hợp các quyền. Ví dụ, Admin => Add File, Remove File, vv –

5

Pablo là đúng xác nhận quyền sở hữu mô tả danh tính. Bạn sử dụng danh tính đó để đưa ra quyết định ủy quyền. Có một sự trừu tượng riêng cho cái gọi là ClaimsAuthorizationManager.

Có một cái nhìn ở đây: http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/

+1

Tôi đọc bài viết này trước khi đăng câu hỏi này, phần tôi quan tâm (và điều tôi không hiểu) là 'ClaimsAuthorization.CheckAccess (“ Get ”,“ CustomerId ”, id.ToString()); câu lệnh'. Cụ thể, làm thế nào một cái gì đó như thế này được thực hiện (trong kịch bản của tôi)? – Matthew

+0

Bạn có thể chuyển "sửa đổi/bất kỳ", "tệp" và chủ sở hữu tệp cho người quản lý authZ xác nhận quyền sở hữu. Điều này sau đó sẽ kiểm tra xem hiệu trưởng hiện tại có khớp với chủ sở hữu tệp hay không. – leastprivilege