5

Tôi đang sử dụng thư viện Thinktecture.IdentityModel xuất sắc để thực hiện xác thực/ủy quyền trong dự án ASP.NET Web API, sẽ được tiêu thụ từ thiết bị di động và máy khách web. Tôi đang sử dụng xác thực cơ bản để xác thực các máy khách di động để truy cập vào api trên web và sử dụng được xây dựng trong thế hệ SessionToken mà Thinktecture.IdentityModel trình bày. Tuy nhiên, tôi có một số lo ngại về cách thu hồi các khiếu nại được thêm vào bộ sưu tập khiếu nại ClaimsIdentity, sau đó (tôi nghĩ) được mã hóa thành SessionToken được cung cấp cho khách hàng ...Làm thế nào để hết hạn/cập nhật ClaimsIdentity Claims được lưu trữ trong một API Web SessionToken

Đây là những gì tôi có cho đến nay:

Tiếp theo ví dụ trong dự án mẫu IdentityModel, tôi đã tạo ra lớp sau

public static class SecurityConfig 
{ 
    public static void ConfigureGlobal(HttpConfiguration globalConfig) 
    { 
     globalConfig.MessageHandlers.Add(new AuthenticationHandler(CreateConfiguration())); 
    } 

    public static AuthenticationConfiguration CreateConfiguration() 
    { 
     var authentication = new AuthenticationConfiguration() 
      { 
       ClaimsAuthenticationManager = new MyClaimsTransformer(), 
       RequireSsl = false, //TODO:TESTING only 
       EnableSessionToken = true, 
       SessionToken = new SessionTokenConfiguration() 
       { 
        EndpointAddress = "/Authenticate" 
       } 
      }; 
     authentication.AddBasicAuthentication(Membership.ValidateUser); 

     return authentication; 
    } 
} 

nào được gọi từ lớp Global.asax của tôi như vậy

SecurityConfig.ConfigureGlobal(GlobalConfiguration.Configuration); 

Thiết bị di động thu thập tên người dùng và mật khẩu từ một cá nhân và đặt tiêu đề xác thực đúng cách và cung cấp thông tin đăng nhập cho điểm cuối web cần thiết http://myhost/api/Authenticate

Trên máy chủ, thành viên của tôi.ValidatUser được gọi với tên người dùng/mật khẩu và nếu được xác thực, phương thức Authenticate của MyClaimsTransformer được gọi.

public class ClaimsTransformer : ClaimsAuthenticationManager 
{ 
    public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) 
    { 
    if (!incomingPrincipal.Identity.IsAuthenticated) 
    { 
     return base.Authenticate(resourceName, incomingPrincipal); 
    } 
    return incomingPrincipal; 
    } 
} 

Máy khách di động sẽ nhận lại mã thông báo có thể chuyển vào tiêu đề xác thực của bất kỳ yêu cầu tiếp theo nào.

Tất cả đều hoạt động tốt.

Bây giờ những gì tôi muốn làm, nằm trong ClaimsTransformer, thêm một số mã sẽ làm điều gì đó giống như mã giả sau đây.

var nameClaim = incomingPrincipal.Claims.First(c => c.Type == ClaimTypes.Name); 

//Using value in nameClaim lookup roles or permissions for this user. 
var someListofRoles = SomeMethodToGetRoles(nameClaim.Value); 

//Add user roles to the Claims collection of the ClaimsPrincipal. 
foreach(var role in someListOfRoles) 
{ 
    incomingPrincipal.Identities.First().AddClaim(new Claim("Role", role.Name)); 
} 

Hy vọng của tôi là để hạn chế số lần tôi cần phải yêu cầu danh sách các vai trò hay quyền cho một người dùng nào đó từ cơ sở dữ liệu, cũng như làm cho nó thuận tiện cho việc kiểm tra các vai trò/quyền trong một tùy chỉnh AuthorizeAttribute .

Tuy nhiên khi tôi bắt đầu thêm, tôi bắt đầu nghĩ về các tình huống mà người dùng đã đăng nhập và đã nhận được mã thông báo này, nhưng thông qua một số hành động của một người dùng khác của hệ thống sẽ thay đổi vai trò của họ hoặc bị thu hồi. Người dùng ban đầu sẽ vẫn có mã thông báo này với danh sách các vai trò/quyền hạn đã hết hạn và sẽ có quyền truy cập vào bất kỳ điều gì cho đến khi mã thông báo hết hạn hoặc sẽ được cấp quyền truy cập mới nhưng không thực sự nhận được quyền truy cập đó cho đến khi họ đăng xuất.

Có cơ chế để vô hiệu hóa SessionToken được tạo theo cách này không? Hoặc, nếu tôi tìm thấy một số cách để biết thay đổi đã được thực hiện đối với vai trò/quyền của người dùng, tôi sẽ sửa đổi các xác nhận quyền sở hữu và phát hành lại SessionToken theo cách liền mạch như thế nào?

Ngoài ra, làm cách nào để hoàn toàn hủy bỏ một SessionToken, tức là nếu tôi muốn 'đăng xuất' một người dùng, nó sẽ hoạt động như thế nào?

Trả lời

4

Cơ sở mã thông báo phiên không có tính năng đó. Chúng tôi muốn giữ cho nó đơn giản để có được xung quanh "gõ vào mật khẩu trên mỗi ứng dụng bắt đầu" vấn đề. Thu hồi rất khó để đạt được mà không có một phụ trợ lưu trữ dữ liệu hoàn chỉnh (mà sẽ làm việc trong các trang trại, vv ..).

Bạn không nên lưu trữ dữ liệu có thể thay đổi theo thời gian phiên trong mã thông báo phiên.

0

thiết kế thông báo thay đổi cơ sở dữ liệu thực sự tùy thuộc vào bạn. những gì tôi đề xuất giống như sử dụng dấu thời gian/hàng tuần để kiểm tra xem dữ liệu (người dùng/vai trò) có lỗi thời hay không. bạn có thể lưu dấu thời gian/chuyển đổi hàng dữ liệu này trên máy chủ như phiên người dùng hoặc cookie/tiêu đề ở phía máy khách của bạn. tôi đề nghị cách tiếp cận cũ.

nếu đã lỗi thời, tôi đề nghị bạn chỉ có thể thực hiện lại phương thức CreateConfiguration(), sẽ tạo lại tất cả thông tin cần thiết phản ánh các thay đổi dữ liệu mới nhất liên quan đến mã thông báo.

+0

Cảm ơn bạn đã trả lời. Tôi chắc chắn có thể phát hiện thông qua tra cứu cơ sở dữ liệu nếu vai trò hoặc quyền được cập nhật/xóa/thêm cho một người dùng cụ thể, chúng tôi đã định thời gian cho các đối tượng này. Đề xuất thực thi lại cấu hình CreateConfiguration có vẻ không chính xác. Theo tôi hiểu nó, đây là một quá trình "thiết lập" một thời gian mà dây lên các đối tượng suy nghĩ để biến áp yêu cầu bồi thường địa phương của tôi và phương pháp xác thực thành viên. Nếu tôi đã thực hiện lại nó, nó có khả năng sẽ làm mất hiệu lực mọi SessionToken của người dùng đã được xác thực, không chỉ là một. – thornhill