Параметр состояния Оуэна и CSRF - PullRequest
0 голосов
/ 10 июля 2019

Исходя из моего понимания, параметр 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 очень предсказуем. Я что-то упустил или это недостаток безопасности?

...