我配置了Identity Server:
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);
}
当用户使用&#34;记住我&#34;选项标识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);
}
}
};
但我无法确定何时设置到期日期。它应该仅在用户选择&#34;记住我&#34;时才设置,但IsPersistent选项在客户端始终为false。
简单的样板项目也存在问题: https://identityserver.github.io/Documentation/docsv2/overview/mvcGettingStarted.html
UPDATE2:
由于Safari中的错误,我需要客户端cookie持久化 - https://openradar.appspot.com/14408523
也许存在一些解决方法,所以我可以在回调中将过期日期从Identity传递给客户端?
UPDATE3:
实际上,我们的身份和客户端服务器具有相同的父域,如app.server.local
和id.server.local
。也许我可以通过属于父域(.server.local
)的附加cookie来传递到期日期?但是我不知道它可以写在Identity上的哪个位置,以及它可以在客户端上应用的地方。
答案 0 :(得分:2)
IdentityServer发布的cookie和客户端应用程序发布的cookie不以任何方式链接。 IdentityServer对客户端应用程序中的cookie没有任何控制权。
当您登录IdentityServer时,会向您发出一个cookie,用于跟踪IdentityServer中经过身份验证的用户。这样可以避免用户输入每个客户端应用程序的凭据,从而促进单点登录。
默认情况下,此Cookie会持续该会话(因此一旦浏览器关闭就会过期),否则如果您设置了#34;请记住我&#34;它将持续一段时间,跨会议。
从IdentityServer成功验证身份令牌后,将发出客户端应用程序中的cookie。此cookie可以包含任何到期时间,任何策略,任何名称。它完全由客户端应用程序控制。在您的情况下,客户端cookie过期可以在客户端应用程序的CookieAuthenticationOptions
中设置。
答案 1 :(得分:1)
您需要处理cookie auth事件。 open id中间件只是创建一个auth cookie,因此你可以从这些事件中处理这个cookie的所有方面。您需要查看事件,只需稍加试错,就可以管理cookie的生命周期。
答案 2 :(得分:1)
您可以使用以下代码在java脚本中执行此操作我已创建此cookie以在14天内过期。
var exdate = new Date();
exdate.setDate(exdate.getDate() + 14);
document.cookie = "yourcookie=" + yourCookieValue + ";expires=" + exdate.toUTCString() + ";";