Исходя из моего понимания, параметр state
в потоке OAuth 2.0 предназначен для использования в качестве токена защиты от подделки для предотвращения CSRF.
А вот реализация по умолчанию шаблона Asp.Net
Identity
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LinkLogin(string provider)
{
// Request a redirect to the external login provider to link a login for the current user
return new AccountController.ChallengeResult(provider, Url.Action("LinkLoginCallback", "Manage"), User.Identity.GetUserId());
}
в AccountController.ChallengeResult.ExecuteResult
это то, что у нас есть
public override void ExecuteResult(ControllerContext context)
{
var properties = new AuthenticationProperties { RedirectUri = RedirectUri };
if (UserId != null)
{
properties.Dictionary[XsrfKey] = UserId;
}
context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
}
в ManageController.LinkLoginCallback()
это то, что у нас есть
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId());
Обратите внимание, что ключ вызова Dictionary[XsrfKey] = UserId
? Это означает, что при сериализации параметра состояния он будет содержать пару ключ-значение "XsrfId" : {user id}
, и это будет наш токен защиты от подделки.
Хотя массированную атаку трудно предпринять против всех пользователей, нацелить ее на конкретного пользователя должно быть относительно просто, поскольку токен CSCF очень предсказуем. Я что-то упустил или это недостаток безопасности?