ASP.NET framework 4.8 cookie认证提供者不触发onValidateIdentity
ASP.NET framework 4.8 cookie authentication provider does not trigger onValidateIdentity
我正在使用 ASP.NET 框架 CookieAuthenticationProvider 生成具有 AspNet.Identity.Core 版本 2.2.2 的身份。
从前端看cookie好像是正确生成的(CookieName、CookieDomain都符合预期)。
但是,我希望每隔 X 秒刷新一次 cookie。在 Microsoft 文档中,它指出我可以为此在 CookieAuthenticationProvider 对象上使用 OnValidateIdentity 属性,但是似乎从未触发过 regenerationIdentityCallback。
需要提及的一件重要事情是我们在 UserManager 中使用 int 变量作为 TKey 而不是 GUID(据我所知这是标准)
当前代码如下所示:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Identity.Application",
CookieName = $".AspNet.SharedCookie-{environment}",
CookieDomain = ".example.com",
LoginPath = new PathString("/"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity =
SecurityStampValidator
.OnValidateIdentity<UserManager<User, int>, User, int>(
validateInterval: TimeSpan.FromSeconds(30),
regenerateIdentityCallback: async (manager, user) =>
{
var identity = await manager.CreateIdentityAsync(user, "Identity.Application");
return identity;
},
getUserIdCallback: (user) => Int32.Parse(user.GetUserId()))
},
TicketDataFormat = new AspNetTicketDataFormat(
new DataProtectorShim(
DataProtectionProvider.Create(keyRingFolderInfo, (builder) => { builder.SetApplicationName($"{environment}-{applicationName}"); })
.CreateProtector(
"Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
"Identity.Application",
"v2"))),
CookieManager = new ChunkingCookieManager()
});
为什么 ValidateInterval 不是每 30 秒重新生成一次标识?我还应该如何让它按照我想要的方式工作?
因为你有一个 int 键,你已经实现了一个自定义的 UserManager,UserStore,(...)
当您实现自己的逻辑时,您还必须实现此接口:
[IUserSecurityStampStore<TUser, in TKey>]
在您的自定义 UseStore 中 class (more infos about this interface).
在这里你可以看到SecurityStampValidator的默认实现。
// Only validate if enough time has elapsed
var validate = (issuedUtc == null);
if (issuedUtc != null)
{
var timeElapsed = currentUtc.Subtract(issuedUtc.Value);
validate = timeElapsed > validateInterval;
}
if (validate)
{ ..... await regenerateIdentityCallback.Invoke(manager, user).WithCurrentCulture()
如您所见,此 class 决定调用 regenerateIdentityCallback 方法。调试此方法,您将了解为什么调用或不调用 regenerateIdentityCallback。
我正在使用 ASP.NET 框架 CookieAuthenticationProvider 生成具有 AspNet.Identity.Core 版本 2.2.2 的身份。
从前端看cookie好像是正确生成的(CookieName、CookieDomain都符合预期)。
但是,我希望每隔 X 秒刷新一次 cookie。在 Microsoft 文档中,它指出我可以为此在 CookieAuthenticationProvider 对象上使用 OnValidateIdentity 属性,但是似乎从未触发过 regenerationIdentityCallback。
需要提及的一件重要事情是我们在 UserManager
当前代码如下所示:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Identity.Application",
CookieName = $".AspNet.SharedCookie-{environment}",
CookieDomain = ".example.com",
LoginPath = new PathString("/"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity =
SecurityStampValidator
.OnValidateIdentity<UserManager<User, int>, User, int>(
validateInterval: TimeSpan.FromSeconds(30),
regenerateIdentityCallback: async (manager, user) =>
{
var identity = await manager.CreateIdentityAsync(user, "Identity.Application");
return identity;
},
getUserIdCallback: (user) => Int32.Parse(user.GetUserId()))
},
TicketDataFormat = new AspNetTicketDataFormat(
new DataProtectorShim(
DataProtectionProvider.Create(keyRingFolderInfo, (builder) => { builder.SetApplicationName($"{environment}-{applicationName}"); })
.CreateProtector(
"Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
"Identity.Application",
"v2"))),
CookieManager = new ChunkingCookieManager()
});
为什么 ValidateInterval 不是每 30 秒重新生成一次标识?我还应该如何让它按照我想要的方式工作?
因为你有一个 int 键,你已经实现了一个自定义的 UserManager,UserStore,(...)
当您实现自己的逻辑时,您还必须实现此接口:
[IUserSecurityStampStore<TUser, in TKey>]
在您的自定义 UseStore 中 class (more infos about this interface).
在这里你可以看到SecurityStampValidator的默认实现。
// Only validate if enough time has elapsed
var validate = (issuedUtc == null);
if (issuedUtc != null)
{
var timeElapsed = currentUtc.Subtract(issuedUtc.Value);
validate = timeElapsed > validateInterval;
}
if (validate)
{ ..... await regenerateIdentityCallback.Invoke(manager, user).WithCurrentCulture()
如您所见,此 class 决定调用 regenerateIdentityCallback 方法。调试此方法,您将了解为什么调用或不调用 regenerateIdentityCallback。