【问题标题】:Trouble with antiforgery token using owin使用 owin 的防伪令牌问题
【发布时间】:2015-02-13 22:58:44
【问题描述】:

我正在使用我的应用程序设置 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.Emailuser@domain.com

【问题讨论】:

  • 随请求发送了哪些 cookie?

标签: c# asp.net-mvc owin


【解决方案1】:

如果用户已登录,则将为该用户颁发防伪令牌。举个例子吧:

  1. 假设您有两个带有防伪令牌的页面与表单数据一起提交:登录页面和搜索页面

  2. 打开搜索页面,进行搜索,就可以了。

  3. 现在在另一个标签页(在浏览器中)打开登录页面并成功登录。

  4. 现在返回到已在上一个选项卡中打开的搜索页面。尝试执行搜索并boooom,您将收到防伪令牌错误。

  5. 现在重新刷新搜索页面,再搜索一次,就可以了。

这是因为最初搜索页面上的令牌没有用户信息,但服务器期望它,因为用户已登录。在重新刷新搜索页面时,令牌会使用登录的用户信息进行更新,因此不会引发错误。

【讨论】:

    猜你喜欢
    • 2013-11-27
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多