我正在使用我的应用设置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
答案 0 :(得分:2)
如果用户已登录,则将为该用户发出防伪标记。让我举个例子:
假设你有两个带有防伪标记的页面,它使用表单数据提交:登录页面和搜索页面
打开搜索页面并执行搜索,没关系。
现在在另一个标签页(在浏览器中)打开登录页面并成功登录。
现在返回上一个标签中已打开的搜索页面。尝试执行搜索和boooom,您将获得防伪标记错误。
现在重新刷新搜索页面并进行另一次搜索,没关系。
这是因为最初搜索页面上的令牌没有用户信息,但服务器期望它,因为用户已登录。重新刷新搜索页面时,令牌会根据登录的用户信息进行更新,因此不会引发任何错误。