2010-11-23 11 views
3

Vor einiger Zeit hatte ich ein Problem mit dem Uploadify Plugin, für das ich eine Lösung gefunden habe, die in dieser answer beschrieben ist.Uploadify Problem mit Authentication Token und Html.AntiforgeryToken (Plugin sendet keine Cookies)

Das Problem in dieser Frage war im Wesentlichen aufgrund der Tatsache, dass Uploadify ein Flash-Plugin verwendet und das Flash-Plugin das Authentifizierungs-Cookie nicht mit dem serverseitigen Code teilt.

Die Lösung bestand darin, eine benutzerdefinierte Version des Autorize-Attributs zu verwenden (der Code wurde in dieser Antwort veröffentlicht).

Das Attribut [TokenizedAuthorize] auf der Controller-Klasse platziert wurde als

[TokenizedAuthorize] 
[CheckForActiveService] 
public partial class DocumentController : BaseController 
{ 
} 

Vor einigen Tagen folgt Ich habe die <%: Html.AntiForgeryToken() %> in der Form und die [ValidateAntiForgeryToken] auf die Aktion-Methode, wie in dem folgende Beispiel hinzugefügt:

[HttpPost] 
[ValidateAntiForgeryToken] 
public virtual ActionResult Upload(HttpPostedFileBase fileData) { 
} 

Trotzdem kann ich keine Dateien mehr auf den Server hochladen. Mit Hilfe des Debuggers ich in der Lage gewesen

im TokenizedAuthorize Code, der nach der letzten Zeile zu überprüfen
return base.AuthorizeCore(httpContext); 

Ich erhalte eine von Elmah behandelte Ausnahme, die

System.Web.Mvc.HttpAntiForgeryException: invalid or not specified anti forgery token 

in System.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization(AuthorizationContext filterContext) 
in System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor) 
in System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 

Diese Ausnahme, dass das [ValidateAntiForgeryToken] Attribut scheint zu bestätigen, sagt wird aufgerufen ... aber ich kann nicht verstehen, wo das Problem mit meinem Code ist.

Irgendwelche Hilfe?

EDIT:

Mit dem Debugger Ich habe den Wert des Parameters __RequestVerificationToken Form geprüft und, wie Sie sehen können, ist es richtig mit dem Wert von <%: Html.AntiForgeryToken() %>

alt text

bevölkert

EDIT 2:

Ich kann auch bestätigen, dass, wenn ich co mment die [ValidateAntiForgeryToken] auf der Beitrag Aktion alles

EDIT 3 erwartet funktioniert:

Da die Post-Funktion ist ein Ajax-Aufruf durch die Uploadify wird auf die Post-Parameter mit einem kleinen js hinzugefügt Plugin die AntiForgeryToken getan Funktion wie im folgenden Code

$('#fileInput').uploadify({ 
    //other uploadify parameters removed for brevity 
    scriptData: AddAntiForgeryToken({ AuthenticationToken: auth }), 
}); 

wo AddAntiForgeryToken() eine Javascript-Funktion in meiner Masterseite definiert ist, all ajax-Post an den Server zu unterstützen

<%-- used for ajax in AddAntiForgeryToken() --%> 
<form id="__AjaxAntiForgeryForm" action="#" method="post"> 
    <%: Html.AntiForgeryToken() %> 
</form> 

// Encapsulate the Anti Forgery Token fetching 
AddAntiForgeryToken = function (data) { 
    data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val(); 
    return data; 
}; 

EDIT 4:

Darin Intuition richtig ist. Das Skript "Uploadify" sendet keine Cookies an den Server, sodass der Server das AntiForgeryToken nicht validieren kann. Wie kann ich das Cookie im Bereich "Uploadify scriptData" hinzufügen?

+0

Eigentlich ist 'System.Web.Mvc.HttpAntiForgeryException' mit der Beschreibung (versuchen, es genau aus Italienisch zu übersetzen)" AntiForgenery Token nicht angegeben oder ungültig. " – Lorenzo

+0

Es ist angegeben, so dass es ungültig ist. Ich würde versuchen, das '<% =' Tag anstelle von '<%:' zu verwenden, aber das ist nur eine Idee ... – Fabian

+0

Eigentlich verwende ich '<%: Html.AntiForgeryToken()%>' nicht, um die Fälschung zu veröffentlichen Zeichen. Der Post wird durch Ajax erledigt, also füge ich einfach das Fälschungstoken in das uploadify-Skript ein. Ich werde die Frage erneut bearbeiten, um Ihnen zu zeigen, wie ... – Lorenzo

Antwort

1

Sie müssen sicherstellen, dass ein Cookie mit dem gleichen Wert wie das Feld __RequestVerificationToken in der Anforderung gesendet wird. Normalerweise wird dieser Cookie von Html.AntiforgeryToken() ausgegeben und muss auf dem Server ausgeführt werden, da sein Wert mit den Server-Maschinenschlüsseln verschlüsselt ist. Wenn die Anfrage von einem Flash-Client durchgeführt wird, weiß ich nicht, ob Cookies gesendet werden. Wenn dies nicht der Fall ist, müssen Sie es manuell senden.

Es gibt auch etwas anderes, das Sie beachten sollten und das die gleiche Ausnahme werfen würde, obwohl ich nicht denke, dass es in Ihrem Fall anwendbar ist, aber eine Überprüfung lohnt. Wenn Sie den Html.AntiforgeryToken() Helfer verwenden, wenn ein eingeloggter Benutzer vorhanden ist, ist sein Benutzername ein Teil des ausgegebenen Cookies. Wenn Sie dann versuchen, an eine Controlleraktion zu senden, die mit [ValidateAntiForgeryToken] dekoriert ist, wird überprüft, ob der aktuell angemeldete Benutzer mit demjenigen identisch ist, als der Cookie ausgegeben wurde. Ist dies nicht der Fall, wird diese Ausnahme ausgelöst. Was ich gesehen habe, sind Leute, die Html.AntiforgeryToken() verwenden, um einige HTML-Formulare als anonymer Benutzer zu generieren und dann AJAX zu verwenden, um sich bei einem Benutzer einzuloggen. Sobald der Benutzer angemeldet ist, reicht er das Formular ein - es wird fehlschlagen.

+0

Vielen Dank für Ihre Hilfe.Alle Punkte in Ihrem ersten Absatz sind in meinem Fall verifiziert. Ich werde posten Details zur Implementierung, wenn Sie fertig sind.danke nochmal – Lorenzo

+0

AFAIK, Flash hat keinen Zugriff auf die Cookies und sendet sie nicht. Zumindest hat das Uploadify nicht. – ZippyV

+0

@ZippyV, hmm danke für die Präzision. Sind Sie sicher a Dies erscheint ein wenig überraschend, weil ich dieses Plugin in authentifizierten Bereichen einiger Websites gesehen habe und ich frage mich, wie es funktioniert? Wenn dies der Fall ist, könnte es das Verhalten erklären. Tatsächlich sprechen wir hier über ein Cookie, das mit dem HttpOnly-Flag markiert ist, so dass es zwar in JavaScript nicht zugänglich ist, aber entlang einer AJAX-Anfrage gesendet wird. Daher bin ich etwas überrascht, wenn Flash es nicht senden würde weiß, weil ich nicht viel Erfahrung mit dieser Technologie habe. –