Anti-Forgery Token Web Api 2

Joh*_*est 7 c# asp.net-mvc asp.net-web-api xamarin

我的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这适用于网络,但如果我正在使用类似客户端的应用程序,UWP或者Xamarin如果我想在不使用a的情况下登录这会成为一个问题,WebView因为它看起来像是Web Api耦合到Web,因为它依赖anti-forgery于在查看并发回提交.假设我希望该客户端应用程序只使用文本框和登录提交按钮,就像我看到的大多数移动应用程序一样.他们通常不会弹出一个WebView.

唯一的解决方案是创建另一种在没有防伪令牌的情况下登录用户的方法吗?这似乎有点混乱,并不能很好地遵循DRY原则,更不用说潜在的安全风险了.

Joh*_*est 1

解决方案是通过向 /Token 端点发送 POST 并覆盖 ApplicationOAuthProvider 以允许客户端访问,从而完全绕过防伪令牌。有关详细信息,请参阅此堆栈交换:

WebAPI [Authorize] 登录时返回错误