更改电子邮件后如何在asp.net中重置授权令牌?

更改电子邮件后如何在asp.net中重置授权令牌?,asp.net,asp.net-mvc,asp.net-identity,token,Asp.net,Asp.net Mvc,Asp.net Identity,Token,我有一个asp网络应用程序。它使用asp网络标识2。如果我更改电子邮件,我的webapi令牌将保持有效。如何重置令牌?对不起,我的语言不好 好的,我发布一个令牌如下: 1) 用户调用webapi方法(获取对{{host}}/token的请求。方法从用户存储库中的usercontext(用户名、密码)查找此用户。如果找到用户,系统将生成token var tokenExpiration = TimeSpan.FromDays(1); var ticket = accountManager.gen

我有一个asp网络应用程序。它使用asp网络标识2。如果我更改电子邮件,我的webapi令牌将保持有效。如何重置令牌?对不起,我的语言不好

好的,我发布一个令牌如下: 1) 用户调用webapi方法(获取对{{host}}/token的请求。方法从用户存储库中的usercontext(用户名、密码)查找此用户。如果找到用户,系统将生成token

var tokenExpiration = TimeSpan.FromDays(1); 
var ticket = accountManager.generateTicket(user.UserName, tokenExpiration);
if (ticket != null){
var token = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket);
return new TokenResponse{
Token = token,
TokenExpires = tokenExpiration.TotalSeconds
};
}
“GeneraticKet”代码:


使令牌无效的正确方法是使用用户DB记录中的值添加claim,该值将在特定事件(如电子邮件更改)后更改,然后在对API的新请求中,必须检查令牌的声明值是否与用户的当前DB记录匹配。有一个名为SecurityStamp的东西,它是Asp.Net identity的一部分,可以执行此操作。您可以阅读有关它的更多信息

要在令牌颁发过程中启用自动SecurityStamp声明,您需要定义用户IUserSecurityStampStore

public class MyUserStore : IUserSecurityStampStore<ApplicationUser>
{
   // some code
}
为了获得额外的许可,请更改电子邮件、确认电话号码、更改密码thigger Asp.Net Identity以重新生成安全戳,这样您就不必担心了


编辑:

authorizationValidator在SecurityStampMatch中具有以下代码:

public bool SecurityStampMatch(string securityStampClaim, Guid userId)
{
    if (String.IsNullOrEmpty(securityStampClaim))
    {
        return false;
    }

    var usersSecurityStamp = _userManager.GetSecurityStamp(userId);
    return securityStampClaim.Equals(usersSecurityStamp);
}

发布一些代码,显示您到目前为止尝试过的内容。您的问题似乎很有趣。不幸的是,到目前为止,我还没有找到重置令牌的方法。令牌是为移动应用程序发布的。它是为特定用户的授权发布的,他可以使用webapi。如果用户更改了他的电子邮件,托克保持有效。用户仍然可以se webapi。我认为,如果调用方法SignOut(),那么不仅cookie会被重置,令牌也会被重置。解决方案将取决于您如何发布和验证令牌。就是这样,我要求您发布代码我尝试在提问中添加此代码,我尝试删除声明(identity.DeleteClaim()),但这对我不起作用。
    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool IsAuthorized(HttpActionContext actionContext)
        {
            var user = actionContext.RequestContext.Principal.Identity;
            if (!user.IsAuthenticated)
            {
                return false;
            }


            var principals = actionContext.RequestContext.Principal.Identity as ClaimsIdentity;
            if (!authorizationValidator.SecurityStampMatch(GetClaimValue(principals, "AspNet.Identity.SecurityStamp"), user.GetGuidUserId()))
            {
                return false;
            }

            return true;
        }

        private string GetClaimValue(ClaimsIdentity principals, string claimType)
        {
            var claim = principals.Claims.FirstOrDefault(c => c.Type.Equals(claimType));
            return claim?.Value;
        }
    }
}
public bool SecurityStampMatch(string securityStampClaim, Guid userId)
{
    if (String.IsNullOrEmpty(securityStampClaim))
    {
        return false;
    }

    var usersSecurityStamp = _userManager.GetSecurityStamp(userId);
    return securityStampClaim.Equals(usersSecurityStamp);
}