簡體   English   中英

從 IdentityServer4 openIdConnect 獲取 IsPersistent 設置

[英]Obtain IsPersistent setting from IdentityServer4 openIdConnect

我有一個 asp.net MVC/angular 應用程序(不是 .net core)使用 OpenIdConnect 對我們的 IdentityServer4 服務器進行身份驗證。 身份服務器上的登錄頁面有一個“記住我”復選框,用於設置身份服務器 cookie 的過期時間。 如果未設置復選框,則 cookie 過期時間設置為已過期,以便在瀏覽器關閉時刷新 cookie。 客戶端 MVC 應用程序還構建了一個客戶端應用程序 cookie。 我希望該 cookie 的到期時間與身份服務器 cookie 的到期時間相匹配。 我可以在身份服務器和客戶端上將 cookie 過期值設置為相同,但這種情況僅在持久狀態匹配時才有效。

例如。 如果用戶在身份服務器登錄時沒有選擇記住我,並且客戶端應用程序像往常一樣使用過期時間,則在瀏覽器關閉時身份服務器 cookie 被刷新,客戶端應用程序 cookie 不會被刪除。 下次用戶導航到該站點時,它在用戶看來就好像他們已登錄。一旦他們嘗試訪問受身份服務器保護的頁面(我們使用 ResourceAuthorization),他們就會被重定向到身份服務器登錄頁面。 我寧願刪除客戶端 cookie,這樣當用戶返回時,它看起來不像他們仍在登錄。

我正在查看 SecurityTokenValidated 事件中的 OpenIdConnectAuthenticationNotifications。 這是 OpenIdConnect 成功身份驗證返回的地方。 在這里,我們構建了客戶端應用程序 authenticationTicket。 創建此票證時,最好至少知道身份服務器的 cookie 是否持久或該 cookie 的到期時間是什么。 這里的 protocolMessage 似乎只包含有關令牌的信息。 令牌過期與 cookie 過期不匹配。 有沒有辦法讓這些 cookie 同步? 我錯過了什么嗎?

舊帖。 回答以便任何其他開發人員可以使用該方法。

這就是我解決它的方法

在身份登錄完成后,我們可以設置一個保存持久性值的 cookie。

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
    _logger.LogInformation("User logged in.");
     this.SetPersistanceCookie(model.RememberMe);
     return RedirectToLocal(returnUrl);
}

private void SetPersistanceCookie(bool rememberMe)
{
        // setting persistant cookie, so that client app can set persistance of the application cookie in accordance with identity cookie
        var persistanceCookieOptions = new CookieOptions
        {
            HttpOnly = true,
            Secure = true,
        };
        HttpContext.Response.Cookies.Append("IsPersistant", rememberMe.ToString(), persistanceCookieOptions);
}

現在設置了此 cookie,您可以使用此 cookie 值在 OnTicketReceived 事件中設置應用程序 cookie 的持久性。

options.Events.OnTicketReceived = async context =>
{
// if for any reason we don't get IsPersistant Cookie (Which is used to set persistance of application cookie from identity cookie)
// we will set Application Cookie to non persistant (i.e. session life time)
       bool rememberMe = context.Request.Cookies.ContainsKey("IsPersistant")
             ? context.Request.Cookies["IsPersistant"].Contains("True")
             : false;
       var authenticationProperties = new AuthenticationProperties()
       {
            IsPersistent = rememberMe,
            ExpiresUtc = DateTime.UtcNow.AddDays(6),
            IssuedUtc = DateTime.UtcNow
       };

       context.Properties = authenticationProperties;
       await Task.FromResult(0);
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM