我配置了身份服务器:
public void Configuration(IAppBuilder app)
{
var factory = new IdentityServerServiceFactory().UseInMemoryClients(new Client[] {
new Client()
{
ClientName = "MyClient",
ClientId = "MyClientId",
Enabled = true,
Flow = Flows.Implicit,
RedirectUris = new List<string> { "MyClientServer/callback" },
};
});
}
和客户端服务器:
public void Configuration(IAppBuilder app)
{
var cookieOptions = new CookieAuthenticationOptions();
cookieOptions.AuthenticationType = "Cookies";
app.UseCookieAuthentication(cookieOptions);
var authenticationOptions = new OpenIdConnectAuthenticationOptions() {
Authority = "https://MyIdentityServer/core",
ClientId = "MyClientId",
SignInAsAuthenticationType = "Cookies",
UseTokenLifetime = true,
RedirectUri = "MyClientServer/callback"
});
app.UseOpenIdConnectAuthentication(authenticationOptions);
}
用户登录使用"记住我"选项身份cookie已过期日期:
idsvr.session expires 04 October ...
但是客户cookie没有:
.AspNet.Cookies at end of session
我该怎么做才能将相同的到期日期设置为客户cookie?
更新:
我可以在客户端应用程序中设置任何到期日期:
authenticationOptions.Provider = new CookieAuthenticationProvider()
{
OnResponseSignIn = (context) =>
{
var isPersistent = context.Properties.IsPersistent;
if (isPersistent) // Always false
{
context.CookieOptions.Expires = DateTime.UtcNow.AddDays(30);
}
}
};
,但我无法确定何时设置到期日期。仅当用户选择"记住我"时,才应设置它,但是始终在客户端始终为false。
问题也存在于简单样板项目上:https://indistityserver.github.io/documentation/docsv2/overview/mvcgettingstarted.html
update2:
我需要客户cookie持续存在,因为Safari中的错误-https://openradar.appspot.com/144408523
也许存在一些解决方法,因此我可以将回调的到期日期从身份转到客户端?
update3:
实际上,我们的身份和客户端服务器具有相同的父域,例如app.server.local
和id.server.local
。也许我可以通过属于父域(.server.local
)的其他cookie传递到期日期?但是我不知道它可以在身份方面写在哪里,以及可以将其应用于客户的位置。
IdentityServer发出的cookie和客户端应用程序发行的cookie均未以任何方式链接。IdentityServer在客户端应用程序中对Cookie没有任何控制。
当您登录IdentityServer时,您会发出一个cookie,该cookie跟踪身份服务器中身份验证的用户。这可以使用户免于输入每个客户端应用程序的凭据,从而促进单个登录。
默认情况下,此cookie可以持续到该会话(因此浏览器关闭后将到期),否则,如果您设置了"记住我",它将持续持续一定的天数。
在成功验证IdentityServer的身份令牌后,将发出客户端应用程序中的cookie。此cookie可以有任何到期时间,任何策略,任何名称。它完全由客户端应用程序控制。在您的情况下,可以在客户端应用程序中的CookieAuthenticationOptions
中设置cookie到期。
您需要处理cookie auth事件。开放ID中间件只是创建一个auth cookie,因此您可以从这些事件中处理此cookie的所有方面。您需要查看这些事件,并且有了一些反复试验,您应该能够管理Cookie寿命。
您可以在此处使用以下代码在Java-Script上进行此操作,我创建了此cookie以在14天内到期。
var exdate = new Date();
exdate.setDate(exdate.getDate() + 14);
document.cookie = "yourcookie=" + yourCookieValue + ";expires=" + exdate.toUTCString() + ";";