Токен защиты от подделки не удалось расшифровать даже на локальном хосте?

Несмотря на то, что я работаю на локальном хосте, мой веб-сайт mvc выдает мне эту ошибку:

Не удалось расшифровать маркер защиты от подделки. Если это приложение размещено в веб-ферме или кластере, убедитесь, что на всех компьютерах работает одна и та же версия веб-страниц ASP.NET и что в конфигурации указаны явные ключи шифрования и проверки. AutoGenerate нельзя использовать в кластере.

Я использовал этот ключ:

<machineKey compatibilityMode="Framework20SP1" validationKey='AC0DA63E787522E3BA5D47D8FA0A46EB68BB89A35C6353D5E8D3D5CA416D0DA607E56C6D0861ED3B7194C3ED74C0CE79FE4CE2909F34A6CFBDE134C1A094CA40' decryptionKey='A68360896EF374401123C6C222A7AAD8D430DB4DE34938E1' validation='SHA1'/>

Но все равно бесполезно. Кроме того, я извлек этот ключ от третьего лица. Я знаю, что это небезопасно, но способ Microsoft слишком сложен: использовать powershell для его создания? сложный. Затем с помощью IIS? Мой IIS8 не показывает модуль машинного ключа. Что, черт возьми, происходит со всеми этими вещами.

Хорошо, возможно, ошибка вызвана несколькими @html.antiforgerytoken. Ну, у меня действительно было два antiforgerytoken, но когда я удалял один из них, ошибка сохранялась.

Я так расстроен этой проблемой. Я надеюсь, что кто-то будет достаточно добр, чтобы помочь. Я считаю, что эти пользователи MVC были в такой ситуации при разработке веб-сайта MVC. В моем случае я просто новичок, и это мой первый развернутый веб-сайт MVC.

спасибо за помощь

ОБНОВЛЕНИЕ

контроллер:

// POST: /Account/Manage
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Manage(ManageUserViewModel model)
    {
        bool hasPassword = HasPassword();
        ViewBag.HasLocalPassword = hasPassword;
        ViewBag.ReturnUrl = Url.Action("Manage");
        if (hasPassword)
        {
            if (ModelState.IsValid)
            {
                IdentityResult result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);
                if (result.Succeeded)
                {
                    return RedirectToAction("Manage", new { Message = ManageMessageId.ChangePasswordSuccess });
                }
                else
                {
                    AddErrors(result);
                }
            }
        }
        else
        {
            // User does not have a password so remove any validation errors caused by a missing OldPassword field
            ModelState state = ModelState["OldPassword"];
            if (state != null)
            {
                state.Errors.Clear();
            }

            if (ModelState.IsValid)
            {
                IdentityResult result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword);
                if (result.Succeeded)
                {
                    return RedirectToAction("Manage", new { Message = ManageMessageId.SetPasswordSuccess });
                }
                else
                {
                    AddErrors(result);
                }
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

Вид:

@using percobaan2.Models;
@using Microsoft.AspNet.Identity;
@{
ViewBag.Title = "Manage Account";
Layout = "~/Views/Shared/_LayoutManage.cshtml";
}

<div class="row-fluid">
<div class="span4 offset4 blog-details">

    <p class="text-success">@ViewBag.StatusMessage</p>

    @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)

        <article class="center">

            @if (ViewBag.HasLocalPassword)
            {
                @Html.Partial("_ChangePasswordPartial")
            }
            else
            {
                @Html.Partial("_SetPasswordPartial")
            }

        </article>
    }
</div>
</div>

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

Макет:

<!DOCTYPE html>
<html lang="en">
<head>
<!-- META DATA -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">

<meta name="description" content="@ViewBag.WebsiteTitle">

<title>@ViewBag.Title - @ViewBag.WebsiteTitle</title>

<link rel="shortcut icon" href="assets/images/ico/favicon.png">

@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")

<!-- GOOGLE WEB FONTS -->
<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,700,600,300,800' rel='stylesheet' type='text/css'>
</head>
<body>

<!-- NAVIGATION -->
<nav class="fixed-top fixed-visable" id="navigation">
    <div class="container">
        <div class="row-fluid">
            <div class="span12 center">
                <!-- MOBILE MENU BUTTON -->
                <div class="mobile-menu" data-toggle="collapse" data-target=".nav-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </div>
                <!-- END MOBILE MENU BUTTON -->
                <!-- MAIN MENU -->
                <ul id="main-menu" class="nav-collapse collapse">
                    <li><a href="@Url.Action("Edit", "Home", new { Area = "Admin", id = 1 })">Home</a></li>
                    <li><a href="@Url.Action("Index", "Slide", new { Area = "Admin" })">Tagline</a></li>
                    <li><a href="@Url.Action("Index", "Division", new { Area = "Admin" })">Division</a></li>
                    <li><a href="@Url.Action("Index", "Contact", new { Area = "Admin" })">Yahoo</a></li>
                    <li><a href="@Url.Action("Index", "Email", new { Area = "Admin" })">Email</a></li>
                    <li><a href="@Url.Action("Index", "Product", new { Area = "Admin" })">Product</a></li>
                    <li><a href="@Url.Action("Index", "Category", new { Area = "Admin" })">Category</a></li>
                    <li><a href="@Url.Action("Index", "Producer", new { Area = "Admin" })">Producer</a></li>
                    <li><a href="@Url.Action("Index", "Unit", new { Area = "Admin" })">Unit</a></li>
                    <li><a href="@Url.Action("Index", "Activity", new { Area = "Admin" })">Activity</a></li>
                    @*@Html.Partial("_LoginPartial")*@
                </ul>
                <!-- END MAIN MENU -->
            </div>
        </div>
    </div>
</nav>
<!-- END NAVIGATION -->
<!-- PAGE | BLOG -->
<div class="pages page-blog-list" id="page-blog-list">
    <div class="container">
        <!-- Header -->
        <header id="headerUpper" class="headerAdmin">
            <h4 class="line-divider">Admin</h4>
            <h1>Change Password</h1>
        </header>
        <!-- End Header -->

            @RenderBody()

    </div>
</div>
<!-- END PAGE | BLOG -->

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@Scripts.Render("~/bundles/plugins")
@Scripts.Render("~/bundles/blog")
@RenderSection("scripts", required: false)
</body>
</html>

Частичный вход:

@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
using (Html.BeginForm("LogOff", "Account", new { Area = "" }, FormMethod.Post, new { id = "logoutForm" }))
{
    @Html.AntiForgeryToken()

    <li>
        @Html.ActionLink("Account", "Manage", "Account", new { Area = "" }, htmlAttributes: new { title = "Manage" })
    </li>

    <li>
        <a href="javascript:document.getElementById('logoutForm').submit()">
            Log off
        </a>
    </li>

    @*<li>
            @Html.ActionLink("Account", "Manage", "Account", new { Area = "" }, htmlAttributes: new { title = "Manage", @class = "phoneNumber" })
        </li>

        <li>
            <a href="javascript:document.getElementById('logoutForm').submit()" class="phoneNumber logOffPadding">
                Log off
            </a>
        </li>*@

}
}
else
{
@*@Html.ActionLink("Register", "Register", "Account", new { Area = "" }, htmlAttributes: new { id = "registerLink", @class = "phoneNumber" })*@

<li>
    @Html.ActionLink("Log in", "Login", "Account", new { Area = "" }, htmlAttributes: new { id = "loginLink", @class = "phoneNumber logInPadding" })
</li>
}

Версия .NET: 4.5


person Ace Supriatna    schedule 05.07.2014    source источник


Ответы (3)


В моем случае это было вызвано тем, что токен защиты от подделки применялся дважды в одной и той же форме. ссылка https://stackoverflow.com/a/28620686/662403

person maurox    schedule 05.05.2016
comment
У меня была та же проблема: два вызова @Html.AntiForgeryToken в одной и той же форме привели к сбою всех отправок. Спасибо за подсказку. - person Danielku15; 19.06.2017

Вы используете IIS или IIS Express? Если вы используете ISS Express, вы, вероятно, создаете новый «сайт» каждый раз, когда нажимаете «Отладка» в Visual Studio. Если это так, удаление файлов cookie в браузере (для локального хоста) решает проблему? (файлы cookie — это место, где хранится информация для аутентификации)

Если вы используете ISS Express, вы можете переключиться на IIS для разработки (вам придется изучить его рано или поздно).

Если вы используете IIS, вам может потребоваться зарегистрировать модуль. Я думаю, что вам не хватает следующей строки из вашего web.config:

<securityTokenHandlers>
   <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</securityTokenHandlers>

Взгляните на следующие ссылки:

Настройка защиты машинного ключа для токенов сеанса

Использование токенов сеанса WIF

При этом это сбивает с толку, забавно то, что этот материал работает из коробки, когда вы создаете новый проект MVC, вы можете отследить, что вы изменили, чтобы он перестал работать. Вам нужен машинный ключ? Собираетесь ли вы запускать это на ферме серверов или в среде с балансировкой нагрузки.

У нас была такая же проблема при использовании Azure и переключении с промежуточной на производственную, поскольку обе машины были разными. В итоге мы подписали наши токены аутентификации сертификатом ssl, чтобы избежать совместного использования машинного ключа.

P.S. Публикация вашего web.config, вероятно, поможет в диагностике этой проблемы.

person Aran Mulholland    schedule 06.07.2014

Убедитесь, что в вашем проекте включен SSL.

Даже если вы используете сгенерированный третьим лицом машинный ключ.

person themikola    schedule 03.11.2014