2017-05-15 18 views
10

Tôi đang lưu trữ vai trò người dùng bên trong JWT (để hạn chế điểm cuối API). Vai trò có thể được thay đổi bởi quản trị viên.Yêu cầu cập nhật/thay đổi vai trò (hoặc bất kỳ xác nhận quyền sở hữu nào khác) trong JWT

Nếu vai trò được thay đổi. Làm thế nào tôi phải phản ánh điều này bên trong tất cả các thẻ? Tôi đã nghĩ về một vài giải pháp:

  • Nếu tôi muốn sử dụng mã thông báo làm mới, người dùng sẽ phải đợi cho đến khi hết hạn mã thông báo truy cập.

  • Tôi có thể lưu bản ghi ID người dùng đã thay đổi và kiểm tra mọi yêu cầu, sau đó trả lại mã thông báo mới nếu người dùng đã bị thay đổi.

Có cách nào tiêu chuẩn để làm điều này không?

+0

Bạn đang sử dụng gì để tạo JWT? IdentityServer? Openddict? – kg743

+0

Hoặc: Đặt thời lượng mã thông báo ngắn. Yêu cầu người dùng làm lại khi danh tính của họ thay đổi. Sử dụng mã thông báo tham chiếu. Một tổng quan ngắn gọn về mã thông báo ref là ở đây https://leastprivilege.com/2015/11/25/reference-tokens-and-introspection/ Một hoop tinh thần tốt để nhảy qua là nghĩ đến khi bạn thay đổi nhóm người dùng trong Active Directory nó đòi hỏi một relogin. Nếu người dùng không, họ vẫn có cùng, cũ, nhóm. Nếu nó đủ tốt cho điều đó, nó sẽ đủ tốt cho bạn. Trừ khi bạn muốn một giải pháp thực sự không thân thiện với người dùng, nơi họ phải làm lại sau mỗi 5 giây. ;) – Mardoxx

+0

@KevinGysberg Im sử dụng JwtSecurityTokenHandler từ System.Identity.Tokens. Nhưng tạo ra các thẻ không phải là vấn đề :) – tobbe

Trả lời

3

Mã thông báo làm mới dường như không phải là giải pháp nếu bạn quan tâm đến những thay đổi bạn đang thực hiện tức thì, có thể bạn không muốn người dùng truy cập công cụ kiểm duyệt trong một thời gian nếu bạn thu hồi quyền của mình.

Những gì bạn có thể làm là giữ số phiên bản trong mã thông báo jwt liên quan đến người dùng, giống như cách thức mongoose thực hiện với số versionKey. Bằng cách này, bạn sẽ có thể kiểm tra phiên bản này dựa vào phiên bản trong cơ sở dữ liệu cho một người dùng cụ thể. Mỗi khi bạn thay đổi vai trò của người dùng này, bạn sẽ tăng phiên bản này, nếu phiên bản của jwt không khớp, chỉ cần tạo lại phiên bản mới với vai trò và phiên bản chính xác và gửi lại cho người dùng.

Tôi không tin rằng có một tiêu chuẩn phù hợp cho điều này, vì jwt là bất biến theo thiết kế, bạn sẽ phải thay đổi hoàn toàn nếu bạn cần "cập nhật" nó.

+0

hmm ok, đây là thông minh, nhưng tôi làm mất statelessness (một từ?) nên là một trong những sức mạnh của JWT. Có lẽ tôi nên đi với một mã thông báo ngẫu nhiên ..? :) – tobbe

+0

Không chắc chắn tôi đã nhận được điều này một cách chính xác, nhưng JWT cũng hữu ích cho việc trao đổi thông tin an toàn có nghĩa là bạn có thể đặt dữ liệu vào chúng có thể được sử dụng để xác nhận và tạo lại tiềm năng. –

+0

Ồ, tôi nghĩ là tôi không nói về các phiên trên máy chủ hoặc trong DB của bạn, thay vào đó là thông tin đã có trong cơ sở dữ liệu về vai trò của người dùng của bạn chứ không phải là triển khai bổ sung để xử lý JWTs, don không tin đó là điều tương tự. –

4

Mã thông báo JWT là không thay đổi, do đó bạn không thể thay đổi/cập nhật xác nhận quyền sở hữu trên mã thông báo hiện tại - do đó bạn phải phát hành mã thông báo JWT mới.

Điều đó dẫn đến sự cố lớn nhất với việc thu hồi mã thông báo JWT. Không có giải pháp tốt. Những gì bạn có thể làm là

  • Giữ JWT ngày hết hạn ngắn (và tùy chọn sử dụng thẻ refresh)

  • Sử dụng một danh sách đen để giữ một danh sách các thẻ bị thu hồi (tất nhiên mất phần 'không quốc tịch' theo cách này)

  • thay đổi khóa bí mật (lưu ý rằng đây thu hồi thẻ ALL hợp lệ của tất cả người dùng)

giải pháp tốt nhất phụ thuộc vào trường hợp cụ thể.

Các vấn đề liên quan