2014-11-05 2 views
1

Чтобы предотвратить использование скриптов на стороне пользователя, я реализую CSP для одного из моих приложений. В настоящий момент я переконфигурирую все html-классы, так что javascript всегда приходит с моего сервера.MVC Ajax.BeginForm и политика безопасности содержимого

Теперь я нашел страницу с Ajax.BeginForm и всегда получаю сообщение об ошибке «Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self'".», если я хочу отправить форму и обновить представление.

Может ли кто-нибудь помочь мне, где проблема?

Вот мои HTML классы (замкнуты):

UserInformation.cshtml:

<div id="OpenAccountInformation">@Html.Action("OpenAccountInformation")</div> 
</div> 

AccountInformation.cshtml:

@Scripts.Render("~/Scripts/bundles/ManageUsers/AccountInformation") 
@model Tumormodelle.Models.ViewModels.AzaraUserModel 

<input type="hidden" value="@ViewBag.Editable" id="EditableUserInformation"> 
<div id="Editable"> 
    @using (Ajax.BeginForm("EditUser", "ManageUsers", new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "OpenAccountInformation", HttpMethod = "post", })) 
    { 
     @Html.AntiForgeryToken() 
     @Html.HiddenFor(m => m.UserID) 
     <div> 
      <div> 
       @Html.LabelFor(m => m.Username, new { @class = "entryFieldLabel" }) 
      </div> 
     </div> 
      <div> 
      <div> 
       <button name="button" value="save" class="formbutton" id="saveButton">save</button> 
       <button name="button" value="cancel" class="formbutton" id="cancelButton">cancel</button> 
      </div> 
        } 
</div> 

<div id="NonEditable"> 

    <div> 
     <div> 
      @Html.LabelFor(m => m.Username, new { @class = "entryFieldLabel" }) 
     </div> 
       </div> 
      <div> 
     <div> 
      <button name="button" value="edit" class="formbutton" id="editButton" type="button">edit</button> 
     </div> 
       </div> 
</div> 

и C# методы:

public ActionResult EditUser(AzaraUserModel AzaraUserModel, string button) 
{ 
    if (button == Tumormodelle.Properties.Resources.Save) 
    { 
     if (ModelState.IsValid) 
     { 
      azaraUserManagement.Update(AzaraUserModel.Username, AzaraUserModel.Title, AzaraUserModel.FirstName, AzaraUserModel.LastName, AzaraUserModel.EMailAddress, null, AzaraUserModel.Phone, AzaraUserModel.UserID, (byte)AzaraUserModel.ShowMail.ID); 
      ViewBag.Message = Tumormodelle.Properties.Resources.Personal_Data_Changed; 
      ViewBag.Editable = true; 
     } 
     else ViewBag.Editable = false; 
     BindShowMailList(); 
     return PartialView("AccountInformation", AzaraUserModel); 
    } 
    else 
    { 
     return RedirectToAction("OpenAccountInformation", "ManageUsers"); 
    } 
} 

public ActionResult UserInformation() 
{ 
    return View("UserInformation"); 
} 

public PartialViewResult OpenAccountInformation() 
{ 
    AzaraUserModel AzaraUserModel = new AzaraUserModel(azaraUserManagement.GetSingle(AzaraSession.Current.UserComparison.GetUser().Id)); 
    BindShowMailList(); 
    ViewBag.Editable = true; 
    return PartialView("AccountInformation", AzaraUserModel); 
} 

Редактировать: С помощью отладчика Chrome я узнаю, что ошибка забрасывается в момент отправки формы.

ответ

1

Ajax.BeginForm будет генерировать инлайн-скрипт в созданном HTML вашей страницы, которую вы запрещенный путем использования script-src 'self' в вашей политике Content Security.

Если вы хотите использовать CSP для предотвращения ввода встроенных скриптов, вы должны использовать Html.BeginForm и добавить JavaScript, чтобы отправить это через Ajax в файл внешнего .js.

0

попытаться добавить этот атрибут к контроллеру после действия

[ValidateInput(false)] 
+0

Нет, что не поможет :(Checkt с отладчиком Visual Studio кажется, что класс C# даже не попал, когда я нажимаю кнопку 'save'. С другой стороны, кнопка' cancel' отлично работает, но не нужно вызывать сервер. – Jastol

Смежные вопросы