【问题标题】:Anti-Forgery Token Web Api 2防伪令牌 Web API 2
【发布时间】:2017-04-03 02:37:07
【问题描述】:

我的 Web Api 站点有一个 AccountController,它使用默认实现进行登录:

// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    // This doesn't count login failures towards account lockout
    // To enable password failures to trigger account lockout, change to shouldLockout: true
    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl);
        case SignInStatus.LockedOut:
            return View("Lockout");
        case SignInStatus.RequiresVerification:
            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
        case SignInStatus.Failure:
        default:
            ModelState.AddModelError("", "Invalid login attempt.");
            return View(model);
    }
}

这适用于网络,但如果我使用像 UWPXamarin 这样的客户端应用程序,如果我想在不使用 WebView 的情况下登录,这将成为一个问题,因为它看起来像 Web Api与网络耦合,因为它依赖于在视图中生成并在提交时回发的anti-forgery 令牌。假设我希望该客户端应用程序像我看到的大多数移动应用程序一样只使用文本框和提交按钮进行登录。他们通常不会弹出WebView

是创建另一种无需防伪令牌即可登录用户的方法的唯一解决方案吗?这看起来有点乱,而且没有很好地遵循 DRY 原则,更不用说潜在的安全风险了。

【问题讨论】:

  • 获取登录页面并获取令牌,然后将您的 POST 发送到登录页面,确保将您获得的令牌发回。

标签: c# asp.net-mvc asp.net-web-api xamarin


【解决方案1】:

对此的答案是通过向 /Token 端点发出 POST 并覆盖 ApplicationOAuthProvider 以允许客户端访问来完全绕过防伪令牌。有关详细信息,请参阅此 stackexchange:

WebAPI [Authorize] returning error when logged in

【讨论】:

    猜你喜欢
    • 2014-10-03
    • 2017-12-29
    • 1970-01-01
    • 2015-01-11
    • 2018-01-02
    • 2019-03-05
    • 2018-01-16
    • 2013-11-27
    • 2015-05-11
    相关资源
    最近更新 更多