C# Asp net核心身份令牌身份验证过期

C# Asp net核心身份令牌身份验证过期,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,我使用asp网络核心身份。这就是我正在尝试做的,我不知道如何做到这一点,所以需要一些专家的帮助。当一个新用户在我的应用程序中注册时,一个密码重置链接被发送到该用户的电子邮件,现在当链接中的链接令牌过期并且用户单击链接时,我需要显示一条消息作为令牌过期。当用户单击电子邮件中的链接时,如何确定令牌是否已过期。有谁能建议实现这种情况的方法吗?ASP.NET核心有一个内置的索赔系统来存储有关用户的信息 为此, 要在注册表中添加CsHelper.time的方法: 在ConfirmEmail.cshtml.

我使用asp网络核心身份。这就是我正在尝试做的,我不知道如何做到这一点,所以需要一些专家的帮助。当一个新用户在我的应用程序中注册时,一个密码重置链接被发送到该用户的电子邮件,现在当链接中的链接令牌过期并且用户单击链接时,我需要显示一条消息作为令牌过期。当用户单击电子邮件中的链接时,如何确定令牌是否已过期。有谁能建议实现这种情况的方法吗?

ASP.NET核心有一个内置的索赔系统来存储有关用户的信息

为此,

要在注册表中添加CsHelper.time的方法:

在ConfirmEmail.cshtml.cs中添加帮助程序方法以检查令牌是否已过期:

在ConfirmEmail.cshtml.cs中调用TokenExpiredValidate:

当用户注册时,AspNetUserClaims表中将有一条记录:


当用户成功确认后,记录将被删除。提醒一下,一种更可靠的方法是使用后台服务清除过期记录。

ASP.NET Core有一个内置的索赔系统来存储有关用户的信息

为此,

添加一个帮助器方法以将过期日期时间存储在Register.cshtml.cs中:

在ConfirmEmail.cshtml.cs中添加帮助程序方法以检查令牌是否已过期:

在ConfirmEmail.cshtml.cs中调用TokenExpiredValidate:

当用户注册时,AspNetUserClaims表中将有一条记录:


当用户成功确认后,记录将被删除。提醒一下,一种更可靠的方法是使用后台服务清除过期记录。

您的问题非常广泛,不一定要特别询问有关ASP.NET核心身份令牌身份验证过期的问题。您应该在以下位置查看ASP.NET标识文档:您的问题非常广泛,不一定要特别询问有关ASP.NET核心标识身份验证过期的问题。您应该在以下位置查看ASP.NET标识文档:谢谢,那很有帮助谢谢,那很有帮助
private async Task AddTokenExpirationInfo(IdentityUser user, int span=1*24*60)
{
    var expiresAt = DateTime.Now.Add(TimeSpan.FromMinutes(span));
    var tokenExpiredAtClaim = new Claim("ActivtationTokenExpiredAt", expiresAt.ToUniversalTime().Ticks.ToString());
    await _userManager.AddClaimAsync(user, tokenExpiredAtClaim);
}
private async Task<bool> TokenExpiredValidate(IdentityUser user) {
    var claims = (await _userManager.GetClaimsAsync(user))
        .Where(c => c.Type == "ActivtationTokenExpiredAt");
    var expiredAt = claims.FirstOrDefault()?.Value;
    bool expired = true;    // default value
    if (expiredAt != null)
    {
        var expires = Convert.ToInt64(expiredAt);
        var now = DateTime.Now.Ticks;
        expired= now <= expires? false : true;
    }
    else {
        expired = false;
    }
    // clear claims
    await _userManager.RemoveClaimsAsync(user, claims);
    return expired;
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { userId = user.Id, code = code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            ///////////////// invoke here  ////////////////////
            AddTokenExpirationInfo(user);

            await _signInManager.SignInAsync(user, isPersistent: false);
            return LocalRedirect(returnUrl);
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}
public async Task<IActionResult> OnGetAsync(string userId, string code)
{
    if (userId == null || code == null)
    {
        return RedirectToPage("/Index");
    }

    var user = await _userManager.FindByIdAsync(userId);
    if (user == null)
    {
        return NotFound($"Unable to load user with ID '{userId}'.");
    }
    var result = await _userManager.ConfirmEmailAsync(user, code);
    if (!result.Succeeded)
    {
        throw new InvalidOperationException($"Error confirming email for user with ID '{userId}':");
    }
    if (await TokenExpiredValidate(user)) 
        throw new InvalidOperationException($"Token has alread expired '{userId}':");

    return Page();
}