我有asp net Web application。它使用 asp 网络标识 2。如果我更改电子邮件,我的 webapi 令牌将保持有效。如何重置令牌?对不起,我的语言不好。
好的,我按如下方式发布令牌: 1) 用户调用 webapi 方法(获取 {{host}}/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
};
}
"生成票证"的代码:
ClaimsIdentity identity = new ClaimsIdentity(OAuthDefaults.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, userName));
var props = new AuthenticationProperties()
{
IssuedUtc = DateTime.UtcNow,
ExpiresUtc = DateTime.UtcNow.Add(tokenExpiration),
};
return new AuthenticationTicket(identity, props);
使令牌无效的正确方法是添加具有用户数据库记录中的值的声明,该值将在某个事件(如电子邮件更改)后更改,然后在向 API 发出新请求时,必须检查令牌的声明值是否与用户的当前数据库记录匹配。有一种叫做SecurityStamp的东西,它是 Asp.Net 身份的一部分,它就是这样做的。您可以在此处阅读有关它的更多信息。
要在令牌颁发过程中启用自动 SecurityStamp 声明,您需要定义您的用户IUserSecurityStampStore:
public class MyUserStore : IUserSecurityStampStore<ApplicationUser>
{
// some code
}
这里有一个例子。
最后,您需要检查当前令牌SecurityStamp声明的正确位置以及用户的DB安全标记。下面是 WebAPI 授权属性的示例:
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;
}
}
}
只是为了指出更改电子邮件,确认电话号码,更改密码提示器 Asp.Net 身份以重新生成安全标记,因此您不必担心。
编辑:
授权验证器在SecurityStampMatch中有以下代码:
public bool SecurityStampMatch(string securityStampClaim, Guid userId)
{
if (String.IsNullOrEmpty(securityStampClaim))
{
return false;
}
var usersSecurityStamp = _userManager.GetSecurityStamp(userId);
return securityStampClaim.Equals(usersSecurityStamp);
}