使用 owin 的防伪令牌出现问题
Trouble with antiforgery token using owin
我正在为我的应用程序设置 OWIN 身份验证,但我遇到了一个问题。我在我的登录页面上设置了验证和防伪令牌,当我创建 POST 时一切正常,但是在另一个页面上设置验证和防伪令牌时我创建 POST 导致出现以下错误:
Anti-forgery token provider was designed for user "user@domain.com" but the current user is "" ...
那么如何在不使用 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,您将收到防伪令牌错误。
现在刷新搜索页面再搜索一次就可以了
这是因为最初搜索页面上的令牌没有用户信息,但服务器需要它,因为用户已登录。在重新刷新搜索页面时,令牌会使用登录的用户信息进行更新,因此不会引发任何错误。
我正在为我的应用程序设置 OWIN 身份验证,但我遇到了一个问题。我在我的登录页面上设置了验证和防伪令牌,当我创建 POST 时一切正常,但是在另一个页面上设置验证和防伪令牌时我创建 POST 导致出现以下错误:
Anti-forgery token provider was designed for user "user@domain.com" but the current user is "" ...
那么如何在不使用 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,您将收到防伪令牌错误。
现在刷新搜索页面再搜索一次就可以了
这是因为最初搜索页面上的令牌没有用户信息,但服务器需要它,因为用户已登录。在重新刷新搜索页面时,令牌会使用登录的用户信息进行更新,因此不会引发任何错误。