2016-07-27 6 views
0

Lassen Sie uns sagen, dass ich die folgenden zwei Aktionsmethoden in einem meiner Controller haben:ASP.NET MVC: secure unbefugt eine anonyme Aktion machen

[AllowAnonymous] 
public async Task<ViewResult> ClearAlerts(string userId) 
{ 
    // Clear the alerts 
} 

[AllowAnonymous] 
public async Task<ViewResult> DenyAlerts(string userId) 
{ 
    // Deny the alerts 
} 

Links zu diesen beiden Handlungsmethoden werden in einer E-Mail gesendet durch meine Bewerbung an eine einzelne Person. userId ist eine GUID-Zeichenfolge, die vom Identity-Framework generiert wird und als Abfrageparameter in die beiden Hyperlinks in der E-Mail eingefügt wird.

Ich bin besorgt, dass diese anonymen Methoden von jemand anderem als der Person, die die E-Mail erhält, aufgerufen werden können.

Ich habe ein paar Fragen:

  1. Gibt es eine Möglichkeit eine anonyme Aktionsmethode zugänglich nur eine einzige Person zu machen, ohne Genehmigung Benutzer zu erfordern?
  2. Wie groß ist die Wahrscheinlichkeit, dass jemand eine gültige userId "rate" diese Methoden damit aufrufen könnte?
  3. Sollte ich nur in den sauren Apfel beißen und für diese Aktionen eine Genehmigung benötigen?

Jeder Rat würde geschätzt werden.

+0

Hat die Person eine Anmeldung/Anmeldedaten, die Sie mit einem Token verknüpfen können, das stattdessen in der E-Mail gesendet wird? So ähnlich, wie das Passwort die Arbeit zurücksetzt oder so? – Nikki9696

+0

Vor allem, wenn es anonyme erlauben, warum Benutzer-ID erforderlich ist, wenn erforderlich, so besser, Autorisierung zu verwenden o einfach Schnittstelle erstellen, die einige Informationen vom Benutzer oder verwenden Sie generieren Guid bei jedem Treffer. –

+0

@ Nikki9696 Ich wollte es vermeiden, die einzelnen individuellen Zugangsdaten zu geben, weil sie eine nicht-technische Person sind, die kein Mitglied unserer Abteilung ist. Ich wollte es so einfach wie möglich machen, dass sie Warnmeldungen auf unserem System löschen und vermeiden, dass sie ein Konto auf unserem System erstellen. Die E-Mail-Adresse dieser Person ist der Anwendung über einen web.config-Dateieintrag bekannt. Ich habe mit der Idee gespielt, eine Art Validierungs-Token zu erzeugen (z. B. einen SHA1-Hash der E-Mail-Adresse des Benutzers). Aber ich war mir nicht sicher, ob das irgendeinen Sinn ergab oder die Sicherheit verbessern würde. –

Antwort

0

Es ist sehr unwahrscheinlich, dass jemand würde eine gültige userId erraten, ich würde mir keine Sorgen machen.

Ich schätze, Sie werden nach einem gültigen Benutzer mit usermanager suchen. Wenn der Benutzer also nicht gefunden wird, bedeutet dies, dass jemand versucht hat, "falsch" auf die Aktionsmethode zuzugreifen. Ignorieren Sie einfach und leiten Sie sie auf eine andere Seite weiter. Wie folgt:

[AllowAnonymous] 
public async Task<ViewResult> ClearAlerts(string userId) 
{ 

     if (string.IsNullOrEmpty(userId)) 
     { 
      return RedirectToAction("Index","Home"); 
     } 

     var user = await UserManager.FindByIdAsync(userId); 

     if(user == null) 
     { 
      return RedirectToAction("Index","Home"); 
     } 

     // do stuff 
} 
+0

Danke. Ja, ich habe eine Logik, die überprüft, ob 'userId' tatsächlich einen echten Benutzer darstellt. Das Problem ist, ob es sehr wahrscheinlich ist, dass jemand anderes als der E-Mail-Empfänger auf diese Aktionsmethoden zugreift und den Alarmstatus aktualisiert. Vielleicht ist es kein so hohes Risiko, da "userId" eine GUID ist, die, wie Sie erwähnt haben, höchst unwahrscheinlich ist, dass sie erraten wird. –