2016-03-24 115 views
0

AngularJsを使用してWebページからRequestVerificationTokenをサーバーに渡すことができません。必要な偽造防止フォームフィールド "__RequestVerificationToken"は存在しません。 AngularJs MVC

マイAngularJsコードは次のとおりです。

var app = angular.module('validation', []); 
app.controller('SignUpController', function ($scope, $http) { 
    $scope.model = {}; 
    $scope.email = {}; 
    $scope.sendEmail = function() { 
     $http({ 
      method: 'POST', 
      url: '/Contact/Test', 
      data: $scope.email, 
      headers: { 
       'RequestVerificationToken': $scope.antiForgeryToken 
      } 
     }).success(); 
    }; 
}); 

カスタム属性コード:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
    public class CustomAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter 
    { 


     private void ValidateRequestHeader(HttpRequestBase request) 
     { 
      string cookieToken = String.Empty; 
      string formToken = String.Empty; 
      string tokenValue = request.Headers["RequestVerificationToken"]; 
      if (!String.IsNullOrEmpty(tokenValue)) 
      { 
       string[] tokens = tokenValue.Split(':'); 
       if (tokens.Length == 2) 
       { 
        cookieToken = tokens[0].Trim(); 
        formToken = tokens[1].Trim(); 
       } 
      } 
      AntiForgery.Validate(cookieToken, formToken); 
     } 

     public void OnAuthorization(AuthorizationContext filterContext) 
     { 

      try 
      { 
       if (filterContext.HttpContext.Request.IsAjaxRequest()) 
       { 
        ValidateRequestHeader(filterContext.HttpContext.Request); 
       } 
       else 
       { 
        AntiForgery.Validate(); 
       } 
      } 
      catch (HttpAntiForgeryException e) 
      { 
       throw new HttpAntiForgeryException("Anti forgery token cookie not found"); 
      } 
     } 
    } 

形式は次のとおりです。

@functions{ 
    public string GetAntiForgeryToken() 
    { 
     string cookieToken, formToken; 
     AntiForgery.GetTokens(null, out cookieToken, out formToken); 
     return cookieToken + ":" + formToken; 
    } 
} 
<div ng-app="validation" ng-controller="SignUpController"> 
    <form role="form" id="frmContact" action="@Url.Action("Index", "Contact")" method="POST"> 
     <input id="antiForgeryToken" ng-model="antiForgeryToken" type="hidden" ng-init="antiForgeryToken='@GetAntiForgeryToken()'" /> 
     <fieldset class="form-group"> 
      @Html.LabelFor(x => x.EmailTitle) 
      @Html.TextBoxFor(x => x.EmailTitle, new { placeholder = @Resource.EmailTitle, @class = "form-control", data_ng_model = "new.email.title" }) 
     </fieldset> 
     <fieldset class="form-group"> 
      @Html.LabelFor(x => x.EmailAddress) 
      @Html.TextBoxFor(x => x.EmailAddress, new { placeholder = @Resource.EmailAddress, @class = "form-control", data_ng_model = "new.email.address" }) 
     </fieldset> 
     <fieldset class="form-group"> 
      @Html.LabelFor(x => x.EmailMessage) 
      @Html.TextAreaFor(x => x.EmailMessage, new { placeholder = @Resource.EmailMessage, @class = "form-control", data_ng_model = "new.email.message" }) 
     </fieldset> 


     <div> 
      <button type="submit" name="btnEmailForm" id="btnEmailForm" class="btnLogin" ng-click="sendEmail()" value="sendMessage">@Resource.ContactFormSendMessageButton</button> 
     </div> 
     <div id="errorMessages" class="error">{{message}}</div> 
    </form> 
</div> 

私は、次の記事を読みましたが、解決に見えることはできませんまた、その例では動作しますが、MVCアプリケーションでは動作しないコードhttps://github.com/techbrij/angularjs-asp-net-mvcからコードを取得しましたイオン:

http://techbrij.com/angularjs-antiforgerytoken-asp-net-mvc

https://parthivpandya.wordpress.com/2013/11/25/angularjs-and-antiforgerytoken-in-asp-net-mvc/

AngularJS Web Api AntiForgeryToken CSRF

http://bartwullems.blogspot.co.uk/2014/10/angularjs-and-aspnet-mvc-isajaxrequest.html

Where exactly to put the antiforgeryToken

http://www.ojdevelops.com/2016/01/using-antiforgerytokens-in-aspnet-mvc.html

は、誰もがあなたがフォームsubmit$scope.sendEmail操作を実行すると、彼らはあなたがng-submitディレクティブを使用することができ、この動作を防ぐために、別のものを競合する可能性があり、この場合では、この問題

+0

明確ではありません:btnEmailFormでフォームをインデックス/連絡先に送信し、同時に/ Contact/Testへの投稿リクエストを実行しますか?そしてあなたのカスタムアトリビュート:それが適用されたアクションの 'CustomAntiForgeryTokenAttribute'?また、antiForgeryTokenの入力には属性 'name = '__RequestVerificationToken''がありません。その理由はサーバーには流れません。 –

+0

私の間違い、この問題を解決することができないと不満を感じるインデックス/コンタクトは/コンタクト/テストする必要があります –

答えて

0

を支援することができます。また、属性:name= '__RequestVerificationToken'ng-value="antiForgeryToken"を対応するinputに追加します。

+0

私はそれを試してみると理解していると思う –

関連する問題