2015-05-19 3 views
0

Метод $ http.post от углового до контроллера MVC с [ValidateAntiForgeryToken] выдает ошибку внутреннего внутреннего сервера 500 с приведенным ниже сообщением. [Мы называем контроллер, проходящим в __RequestVerificationToken в заголовке, а также данные.] Мы используем Microsoft.AspNet.Mvc-6.0.0-Beta4

<span class="light exception">System.InvalidOperationException</span><br /> 
<span class="heavy">Incorrect Content-Type: application/json;charset=UTF-8</span><br /> 
<div class="stacktrace"> 
<pre><span class="faded">at Microsoft.AspNet.Http.Core.</span>FormFeature.&lt;ReadFormAsync&gt;d__12.MoveNext<span class="faded"> 
;()</span></pre> 
    <br /><pre><span class="faded">at System.Runtime.CompilerServices.</span>TaskAwaiter.ThrowForNonSuccess<span class="faded">(Task task)</span></pre> 
    <br /><pre><span class="faded">at System.Runtime.CompilerServices.</span>TaskAwaiter.HandleNonSuccessAndDebuggerNotification<span class="faded">(Task task)</span></pre> 
    <br /><pre><span class="faded">at System.Runtime.CompilerServices.</span>TaskAwaiter&lt;TResult&gt;.GetResult<span class="faded">()</span></pre> 
    <br /><pre><span class="faded">at Microsoft.AspNet.Mvc.</span>AntiForgeryTokenStore.&lt;GetFormTokenAsync&gt;d__4.MoveNext<span class="faded">()</span></pre> 
+0

Проблема решена. См. Следующую ссылку. https://github.com/aspnet/Mvc/issues/2579 –

ответ

0

Я написал атрибут пользовательских проверок для этого (работ с бета4). Используйте его, как обычный.

public class ValidateAntiForgeryTokenFromHeaderAttribute : ActionFilterAttribute, IFilter { 
    public override void OnActionExecuting (ActionExecutingContext actionContext) { 
     if (actionContext == null) throw new ArgumentNullException(nameof(actionContext)); 

     base.OnActionExecuting(actionContext); 

     AntiForgery antiForgery = actionContext.HttpContext.ApplicationServices.GetService(typeof(AntiForgery)) as AntiForgery; 

     var options = actionContext.HttpContext.ApplicationServices.GetService(typeof(IOptions<MvcOptions>)) as IOptions<MvcOptions>; 
     var config = options.Options.AntiForgeryOptions; 

     var request = actionContext.HttpContext.Request; 

     String cookieToken = request.Cookies[config.CookieName]; 
     String formToken = request.Headers.Get("X-XSRF-Token"); 

     antiForgery.Validate(actionContext.HttpContext, cookieToken, formToken); 
    } 
} 

В угловой, я настраивал $http в run методе приложения следующим образом:

$http.defaults 
    .headers 
    .common[$http.defaults.xsrfHeaderName] = angular.element("input[name='__RequestVerificationToken']") 
                .attr("value"); 
Смежные вопросы