使用owin的防伪造代币出现问题
本文关键字:问题 伪造 owin 使用 | 更新日期: 2024-05-04 14:55:45
我正在用我的应用程序设置OWIN身份验证,但我有一个问题。我在登录页面上设置了验证和防伪令牌,当我进行POST时,一切都很好,但在另一个页面上,当我执行POST时设置验证和防伪标记会导致出现以下错误:
防伪令牌提供程序是为用户设计的"user@domain.com"但当前用户是"…
那么,如果不在Global.asax中使用AntiForgeryConfig.SuppressIdentityHeuristicCheck
,我该如何解决这个问题呢?
为什么防伪令牌不接受当前用户?
更新
Task<ClaimsIdentity>
实现如下:
public override Task<ClaimsIdentity> CreateIdentityAsync(AppUser user, string authenticationType)
{
return Task<ClaimsIdentity>.Factory.StartNew(() =>
{
var claimsList = new List<Claim>()
{
new Claim(ClaimTypes.Name, user.Email),
};
return new ClaimsIdentity(authenticationType);
});
}
Task SignInAsync
是这样的:
public override async Task SignInAsync(AppUser user, bool isPersistent, bool rememberBrowser)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
identity.AddClaim(new Claim(ClaimTypes.Name, user.Email));
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}
user.Email
是user@domain.com
如果用户已登录,则将为该用户颁发防伪令牌。让我给你举个例子:
-
假设您有两个带有防伪令牌的页面,它们与表单数据一起提交:登录页面和搜索页面
-
打开搜索页面并执行搜索,就可以了。
-
现在打开另一个选项卡上的登录页面(在浏览器中)并成功登录。
-
现在返回到上一个选项卡中已经打开的搜索页面。尝试执行搜索和boooom,您将得到防伪令牌错误。
-
现在重新刷新搜索页面并进行另一次搜索,一切都会好起来的。
这是因为最初搜索页面上的令牌没有用户信息,但服务器期望它,因为用户已经登录。重新刷新搜索页面时,令牌会更新为已登录的用户信息,因此不会出错。