2017-11-14 23 views
5

Tôi có API web trong lõi .net 1.0 phát hành mã thông báo JWT (access_token) cho khách hàng khi đăng nhập. Bây giờ, mã thông báo có khoảng thời gian hết hạn ngắn (10 phút) và khách hàng yêu cầu một mã thông báo mới trong mỗi 8 phút cho tính liên tục của phiên. Mã thông báo này được lưu trữ trong cookie trong trình duyệt ở phía máy khách. Bây giờ, tính năng này hoạt động tốt nếu ứng dụng khách chỉ hoạt động trong một tab của trình duyệt. Tuy nhiên, nếu khách hàng mở hai hoặc nhiều tab, mỗi 8 phút yêu cầu mã thông báo mới được thực hiện cho API. Điều này dẫn đến nhiều yêu cầu từ cùng một người dùng cùng một lúc và mã thông báo ứng dụng của tôi cho mỗi và mọi yêu cầu nhưng chỉ một trong các mã thông báo được lưu trữ ở cookie bên ứng dụng khách. Nhưng nó kết quả trong nhiều mã thông báo trong đó chỉ có duy nhất một được sử dụng trong suốt cuộc đời của nó.Làm cách nào để tạo sự cố API chỉ một mã thông báo cho mỗi người dùng (được mở trong nhiều tab)?

Tôi đã thử lưu trữ userId và mã thông báo trong DB và kiểm tra chéo chúng trong yêu cầu API, tuy nhiên, cùng một người dùng trong nhiều tab yêu cầu đồng thời và logic không thành công ở đây.

Tôi làm cách nào để giải quyết tình huống này? Tôi muốn API của mình chỉ phát hành một mã thông báo cho mỗi người dùng được mở trong nhiều tab. Bất kỳ trợ giúp được đánh giá cao.

+0

để bạn muốn API của mình phát hành một mã thông báo duy nhất cho mọi yêu cầu của người dùng ngay cả khi họ có nhiều tab đang mở? – Shaw

+0

Có, cho cùng một người dùng được mở trong nhiều tab. – saurabhadhikari

+3

Bạn cần chia sẻ các thẻ betweeb mã thông báo. Giao diện người dùng nên sử dụng lại nó khi có hoặc yêu cầu một giao diện mới và cung cấp cho phần còn lại của các tab. Nó có thể được thực hiện bằng cách sử dụng localStorage thay vì cookie và các sự kiện để truyền đạt một sự thay đổi. Xem https://stackoverflow.com/questions/20325763/browser-sessionstorage-share-between-tabs – pedrofb

Trả lời

0

Điều này rất khó. Nếu bạn cố gắng lưu trữ mã thông báo trong DB và không phát hành mã thông báo mới cho đến khi mã hết hạn, nó sẽ tạo ra rất nhiều vấn đề. Hãy nghĩ về trường hợp này, khi người dùng sử dụng nhiều thiết bị. Logic này sẽ không hoạt động. Có nhiều trường hợp hơn.

Và lưu trữ JWT trong máy chủ là rất dư thừa và chống trực quan, IMO. Một trong những lợi ích chính của JWT là bạn không phải thực hiện cuộc gọi DB mỗi lần một tài nguyên được bảo vệ được yêu cầu. Bản thân JWT có tất cả thông tin cho phép người dùng.

Tôi tin rằng, giải pháp bạn đang tìm kiếm là điều chỉnh hoặc giới hạn tốc độ. Bạn có thể giới hạn điểm cuối của vấn đề mã thông báo thành 1request/sec/ip (thử nghiệm và tìm tốc độ hoạt động tốt). Ý tưởng là để chặn các yêu cầu đồng thời cho các vấn đề mã thông báo mới từ cùng một IP và xử lý chỉ một trong số chúng. Bạn có thể đạt được điều này thông qua IIS hoặc thông qua Attributes. Chơi xung quanh và xem những gì hoạt động tốt nhất cho bạn.

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