我正在将索赔添加到索赔主体身份,并将用户登录。在随后的请求中,索赔主体在应用程序中的任何地方都可以使用添加的索赔,但只需25分钟。我还没做过25到30分钟的测试。30分钟后,理赔主体标识仍然是经过身份验证的,但只有来自标识数据库的声明。在Login添加的"CookieClaim“丢失了。声明主体身份"IsAuthenticated“仍然是正确的,Nav菜单中的问候语仍然是"Hi emailaddress”。如果我们在20分钟提出要求,这并不重要。
我希望只要用户登录,这些声明就可以使用。
该应用程序使用OAuth从多个外部提供者获取用户的访问令牌和其他信息,该信息用于整个应用程序的授权。我选择将信息放在cookie中,因为它可能会定期更改,并且不适合存储在标识数据库中。
下面的代码来自我为演示的LoginModel核心应用程序的脚手架asp.net。它与我的主要应用程序不完全一样,但是添加了声明,输入"CookieClaim“并使用相同的方法登录。从"IdentityUser用户.“开始的四行这是我对模板asp.net核心web应用程序所做的唯一更改(在搭建“登录”页面之后,使用本地用户帐户)
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
IdentityUser user = await _signInManager.UserManager.FindByEmailAsync(Input.Email);
ClaimsPrincipal currentUser = await _signInManager.CreateUserPrincipalAsync(user);
currentUser.Identities.ElementAt(0).AddClaim(new Claim("CookieClaim", "I am in the Cookie"));
await HttpContext.SignInAsync(IdentityConstants.ApplicationScheme, currentUser, new AuthenticationProperties());
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
在这个应用程序的身份数据库中,我为用户添加了一个声明,输入“IdentityDatabaseClaim”。此图像显示登录后索赔主体的声明。对于前25分钟的任何请求,这种情况都没有改变:
30分钟后,来自数据库的声明仍然存在,但是登录时在cookie中发送的声明类型"CookieClaim“并不存在,如下所示:
请注意,对于索赔主体标识而言,IsAuthenticated仍然是正确的,此时,来自Identity数据库的所有声明都在那里。
我已经尝试将ExpireTimeSpan设置在Startup.cs中的cookie上,但这没有任何效果。我很确定这个问题不是cookie过期,否则用户仍然无法通过身份验证。我还尝试在身份验证属性上设置IsPersistent、IssuedUtc和ExpiresUtc,主要是为了避免给任何人提供这些属性作为这个问题的答案的麻烦。没什么不同的。
我需要知道是什么方法或设置导致HttpContext (表面上)忽略请求cookie中的数据,并从标识数据库中创建一个新的Claims主体,以及我是否可以( a)关闭它或( b)捕获它,以便在它删除它们之前保存这些声明,并在它试图通过下一个授权筛选器之前再附加它们。
发布于 2020-02-28 21:08:35
只有当我们使用Application.Identity方案(IdentityConstants.ApplicationScheme)登录时,才会发生这种行为。使用不同的方案登录,您添加到该身份的任何声明都将持续到cookie。所以在ConfigureServices in Startup.cs中:
services.AddAuthentication()
.AddCookie("CustomClaimsCookie")
然后在OnGetCallbackAsync()方法中登录时,
ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync();
AuthenticationProperties props = new AuthenticationProperties();
props.StoreTokens(info.AuthenticationTokens);
await HttpContext.SignInAsync("CustomClaimsCookie", info.Principal, props);
发布于 2021-09-27 06:54:14
所提供的解决方案对我无效,但我找到了这个https://github.com/dotnet/aspnetcore/issues/10328#issuecomment-493451017
每15-20分钟刷新一次
是有意义的,因为这是我们从后端数据库刷新cookie的时候,而且由于您的更改不是从那里来的,所以您的附加声明将不会被刷新。所以有几种方法可以解决这个问题;
ApplicationUser
我试过第二次了。它可以工作,但每次都会进入数据库。需要找到解决方案-如何在登录后更新cookie。
然后,我尝试了第一个解决方案--只需将"MyClaim“存储在AspNetUserClaims标识表中即可。我们可以使用UserManagerTUser管理索赔。看来很管用。
https://stackoverflow.com/questions/60426024
复制相似问题