2013-08-07 15 views
6

benim uygulamadaangularjs

kimlik doğrulaması yönetmek için yaptık bir angularjs hizmetine benim giriş şeklinde bir Jilet MVC yardımcı tarafından oluşturulan bir RequestVerificationToken iletmek isteyeceğiniz bir hizmete requestVerificationToken geçmesi benim @ Html.AntiForgeryToken() bu şekilde kılan

<div ng-model="loginRequest" > 
     <form ng-submit="submit()" ng-controller="loginCtrl"> 
      @Html.AntiForgeryToken() 

      <input id="username" ng-model="loginRequest.Username" type="text" name="text" /> 
      <input id="password" ng-model="loginRequest.Password" type="text" name="text" /> 
      <input type="submit" id="submit" value="Submit" /> 
      <br/> 
      isValid: {{loginRequest.isValid}} 
      <br/> 
      username: {{loginRequest.Username}} 
      <br/> 
      Password: {{loginRequest.Password}} 
     </form> 
    </div> 

:

<input name="__RequestVerificationToken" type="hidden" value="AVzyqDKHSPjaY7L_GTpkasMAABRQRVRFUkFMSUVOV0FSRVxQZWRybwA1"> 

benim AngujarJs kontrolör başarılı enjekte formu şudur ly benim "loginService" ve ben

function loginCtrl($scope, loginService) { 
    $scope.submit = function() { 
     loginService.authenticate($scope.loginRequest,function(data) { 
      $scope.loginRequest.isValid = (data.User!=null); 
      //console.log(data); 
     }); 

    }; 
} 

hizmet servisine Post üzerinden kullanıcı adı ve şifre gönderebiliriz:

angular.module('App.services', ['ngResource']). 
    factory('loginService', 
     function ($resource) { 
      return $resource('/Api/User/login', '', 
       { 
         authenticate: { 
         method: 'POST', 
         isArray: false, 
         headers: { 'X-XSRF-Token': '?????' } 
        } 
       }); 
     }); 

benim sorum nasıl olabilir okudum formda verilen belirteç ve Hizmete iletin ve Giriş formundan alınan jetonu içeren bir üstbilgiyi ayarlayın. Bildiğim kadarıyla, DOM'u manipüle etmek için iyi bir uygulama değildir ve bunu gerçekleştirmek için bir yönerge oluşturmanız gerekip gerekmediğini bilmiyorum. Görev böylece herhangi bir öneri açığız!

+0

Hope http://www.infoq.com/news/2012/10/anti-forgery-aspnet-json ve http://stackoverflow.com/questions/15574486/angular-against baktım -asp-net-webapi-device-csrf-on-the-sunucu – Chandermani

+0

evet yaptım, ben bunun için servicestack kullanıyorum Sadece her şeyi kapalı var Ben sadece parametreyi hizmete nasıl geçeceğini bilmek gerekiyor! Aslında burada açıklanan benzer bir yaklaşımı takip ediyorum düşünüyorum http://stackoverflow.com/questions/15444781/angularjs-cant-find-xsrf-token-cookie –

+0

cevabımı hiç yardımcı oldu mu? –

cevap

14

Ben oldukça iyi bir çözüm buldum. Buradaki önerilere http://www.novanet.no/no/blog/olav-nybo/dates/2013/12/anti-forgery-tokens-using-mvc-web-api-and-angularjs/'dan başladım ama problem, direktifin kontrolörden sonra yürütülmesiydi. Yani, kontrolördeki ilk verileri almak istiyorsanız çok zordu.

Yönergeyi kullanmak yerine, HTTP Header Ayarı bölüm http://docs.angularjs.org/api/ng.$http altındaki $ http hizmet belgelerinde başvurulan Module.run() yöntemini kullanın.

Ben gövde elemanı ile yukarıdaki blog yayınında başvurulan HtmlHelper uzantısı kullanılır ve sonra benim Module.run() aşağıdaki gibidir:

myModule.run(['$http', function($http) { 
    $http.defaults.headers.common['RequestVerificationToken'] = angular.element("body").attr('ncg-request-verification-token'); 
}]); 

Bence Amerika düzenli bir çözüm olduğunu düşünüyorum.

+2

Güncelleştirme için teşekkürler bu IMO –

+1

belirteci işlemek için doğru yoldur! –

3

ne yazık ki, en kolay yolu angular.js önce projeye jquery.js dahil etmektir, o zaman bunu:

headers: { 'X-XSRF-Token': angular.element('input[name="__RequestVerificationToken"]') } 
+0

hey @Jason More, JQuery kullanmadan bir yolunu öğrenmek istemiyorum, tavsiye edilmediğini varsayalım, şu an angularJS öğreniyorum, bu yüzden başlangıçtan beri doğru ayağıyla başlamak istiyorum! –

+1

Maalesef iki şeyi karıştırıyorsunuz: Sunucu tarafı oluşturma (tıraş makinesi) ve istemci tarafı şablonlandırma (köşeli). jQuery, aralarındaki yapıştırıcıdır. Etrafta soracağım ama daha fazla düşündükten sonra, bu doğru yol olduğuna inanıyorum –

+1

@Pedro DOM'dan çıkarmak için bir şeyler yapmanız gerekecek ...Eğer Jason Açısal hizmet/sağlayıcıya/fabrikaya gönderilmiş kod bit ekleyin ve sonra giriş hizmetine ki enjekte, ama gerçekten bu sadece test etmek daha kolay yapabilir soyutlama katmanı ekliyor olabilir. – Polaris878

0

Aynı sorunu yaşadım ve özel bir HtmlHelper uygulamasında özel bir AntiForgeryToken yöntemi çözdüm.

public static IHtmlString AngularAntiForgeryToken(this HtmlHelper html, string ngModelName = "AntiForgeryToken") 
{ 
    MvcHtmlString antiForgery = html.AntiForgeryToken(); 
    string antiForgeryString = antiForgery.ToString(); 
    Regex regex = new Regex(string.Format("value=[\"|']([a-zA-Z0-9+=/\\-_]+)[\"|']", ngModelName)); 
    Match match = regex.Match(antiForgeryString); 
    string antiForgeryToken = string.Empty; 
    if (match.Success) 
     antiForgeryToken = match.Groups[1].ToString(); 

    string result = antiForgeryString.Replace("<input", string.Format("<input ng-model=\"{0}\" ng-init=\"{0} = '{1}'\"", ngModelName, antiForgeryToken)); 

    return new HtmlString(result); 
}