के साथ वेब एपीआई के लिए मान्यकरण एंटीफॉर्गेरी टोकन विशेषता लागू करने में समस्याएं मैं जेएसओएन-आधारित AJAX अनुरोध कर रहा हूं और एमवीसी नियंत्रकों के साथ फिल हैक के Preventing CSRF with AJAX और जोहान ड्रिसेन के Updated Anti-XSRF for MVC 4 RC के लिए बहुत आभारी हैं। लेकिन, जैसा कि मैं वेब एपीआई में एपीआई-केंद्रित नियंत्रकों को संक्रमण करता हूं, मैं उन मुद्दों को मार रहा हूं जहां दोनों दृष्टिकोणों के बीच कार्यक्षमता काफी अलग है और मैं सीएसआरएफ कोड को स्थानांतरित करने में असमर्थ हूं।एमवीसी 4 आरसी
स्कॉट्स ने हाल ही में question उठाया जो डारिन डिमिट्रोव द्वारा answered था। डारिन के समाधान में एक प्राधिकरण फ़िल्टर को कार्यान्वित करना शामिल है जो एंटीफॉर्गेरी। वैलिडेट को कॉल करता है। दुर्भाग्य से, यह कोड मेरे लिए काम नहीं करता है (अगले अनुच्छेद देखें) और - ईमानदारी से - मेरे लिए बहुत उन्नत है।
जैसा कि मैं इसे समझता हूं, फिल का समाधान एमवीसी एंटीफॉर्गेरी के साथ समस्या को खत्म करता है जब एक फॉर्म तत्व की अनुपस्थिति में JSON अनुरोध करता है; फॉर्म तत्व एंटीफॉर्गेरी द्वारा सत्यापित/अपेक्षित है। वैध विधि। मैं पर विश्वास करता हूं कि यही कारण है कि मुझे डारिन के समाधान के साथ भी समस्याएं आ रही हैं। मुझे एक HttpAntiForgeryException प्राप्त होता है "आवश्यक एंटी-फोर्जरी फॉर्म फ़ील्ड '__RequestVerificationToken' मौजूद नहीं है"। मुझे यकीन है कि टोकन पोस्ट किया जा रहा है (हालांकि फिल हेक के समाधान के शीर्षलेख में)। यहाँ ग्राहक की कॉल का एक स्नैपशॉट है:
$token = $('input[name=""__RequestVerificationToken""]').val();
$.ajax({
url:/api/states",
type: "POST",
dataType: "json",
contentType: "application/json: charset=utf-8",
headers: { __RequestVerificationToken: $token }
}).done(function (json) {
...
});
मैं एक साथ डैरिन के साथ जोहान समाधान mashing द्वारा हैक करने की कोशिश की और काम बातें प्राप्त करने में सक्षम था, लेकिन HttpContext.Current शुरू कर रहा हूँ, अनिश्चित है कि क्या यह उचित/सुरक्षित है और यही कारण है कि मैं प्रदान किए गए HttpActionContext का उपयोग नहीं कर सकते हैं।
public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
try
{
var cookie = HttpContext.Current.Request.Cookies[AntiForgeryConfig.CookieName];
AntiForgery.Validate(cookie != null ? cookie.Value : null, HttpContext.Current.Request.Headers["__RequestVerificationToken"]);
}
catch
{
actionContext.Response = new HttpResponseMessage
{
StatusCode = HttpStatusCode.Forbidden,
RequestMessage = actionContext.ControllerContext.Request
};
return FromResult(actionContext.Response);
}
return continuation();
}
मेरे सवाल कर रहे हैं:
- हूँ यह सोच कर कि डैरिन समाधान हो जाती है में मैं सही
यहाँ मेरी असजीला मैश-अप .. परिवर्तन कोशिश ब्लॉक में 2 लाइनों है एक फॉर्म तत्व का अस्तित्व?
- जोहान के एमवीसी 4 आरसी कोड के साथ डारिन के वेब एपीआई फ़िल्टर को मैश-अप करने का एक शानदार तरीका क्या है?
अग्रिम धन्यवाद!
FromResult क्या है? –