Tôi đang cố gắng triển khai hết hạn phiên trượt. Tôi đang sử dụng Windows Azure ACS, .Net 4.5, WIF. Khi lần đầu tiên tôi nhận được dấu hiệu, những gì tôi đang làm là thiết lập thời gian hết hạn mặc định của nó đến 2 giờ và viết rằng thẻ vào bánh như trong đoạn code dưới đây:WIF SessionSecurityToken Expiration
internal void SetSession(ClaimsPrincipal principal)
{
var sessionToken = new SessionSecurityToken(principal, TimeSpan.FromMinutes(120));
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);
Thread.CurrentPrincipal = principal;
}
Tại thời điểm này, nếu tôi kiểm tra ValidFrom
và ValidTo
thuộc tính của biến sessionToken
, tôi nhận được các giá trị thích hợp như thể hiện trong hình dưới đây:
Bây giờ để thực hiện trượt phiên hết hạn, tôi đang xử lý SessionAuthenticationModule_SessionSecurityTokenReceived
sự kiện trong tập tin Global.asax
tôi như hình dưới đây:
void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
{
var sessionToken = e.SessionToken;
}
Tuy nhiên khi tôi kiểm tra ValidFrom
và ValidTo
thuộc tính của thẻ, nó không phải là những gì tôi thiết lập khi tôi đang viết những dấu hiệu như cookie như thể hiện trong hình dưới đây:
Không chắc chắn lý do tại sao điều này xảy ra. Ai có thể giải thích những gì tôi đang làm sai.
UPDATE:
Dưới đây là một điều thú vị tôi nhận thấy. Cách tôi đã thực hiện phiên trượt là tôi kiểm tra thuộc tính ValidTo
của mã thông báo và so sánh với ngày/giờ hiện tại (theo UTC). Nếu sự khác biệt là chưa đầy 5 phút, tôi tăng ValidTo
thời gian bằng cách 2 giờ và phát hành lại cookie như trong đoạn code dưới đây:
void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
{
var sessionToken = e.SessionToken;
var currentDateTime = DateTime.UtcNow.Ticks;
var sessionExpirationDateTime = sessionToken.ValidTo.Ticks;
if (sessionExpirationDateTime >= currentDateTime)
{
var renewTokenWindow = 5 * 60 * 1000;//5 minutes
TimeSpan ts = new TimeSpan(sessionExpirationDateTime - currentDateTime);
if (ts.TotalMilliseconds < renewTokenWindow)
{
var newSessionTokenExpiry = sessionToken.ValidTo.AddMinutes(120);
//Renew token
SessionAuthenticationModule sam = sender as SessionAuthenticationModule;
var newSessionToken = sam.CreateSessionSecurityToken(sessionToken.ClaimsPrincipal, sessionToken.Context, sessionToken.ValidFrom, newSessionTokenExpiry, sessionToken.IsPersistent);
e.SessionToken = newSessionToken;
e.ReissueCookie = true;
}
}
}
Bây giờ sau đó nếu tôi kiểm tra giá trị của ValidTo
tài sản trong các yêu cầu tiếp theo, nó thực sự tôn vinh giá trị tôi đang thiết lập như hình dưới đây. Và giá trị này được yêu cầu liên tục sau khi yêu cầu tức là khi tôi phát hành lại mã thông báo, mọi thứ đều hoạt động tốt.
Cảm ơn Brock. Tuy nhiên tôi vẫn không hiểu tại sao giá trị 'ValidTo' không được đặt thành giá trị tôi muốn. Nó là một lỗi với WIF hoặc tôi đang làm một cái gì đó không chính xác? –
Hi Brock/Gaurav - Bạn đã tìm ra lý do tại sao giá trị 'ValidTo' không được đặt chính xác? – Mike
Xin lỗi ... Tôi đã cập nhật câu trả lời từ lâu. Về cơ bản, hết hạn mã thông báo mặc định được đặt trong cổng Windows Azure ACS. Bất cứ giá trị nào được đặt ở đó đều được chọn lần đầu tiên. HTH. –