2013-05-05 16 views
7

Ich versuche, einen anonymen Controller zu erstellen, um Formularauthentifizierung zu erreichen. Ich konfigurierte meinen IIS 7 mit anonymer Authentifizierung und Formularauthentifizierung aktiviert und setzte meine web.config zu deny anonyme Benutzer. Auf dem Login-Controller habe ich die [AllowAnonymous] -Dekoration auf meinen Controller (und meine Aktionen) gesetzt.Formulare Authentifizierung und Autorisierung MVC 4

Die einzige Aktion, die ich bei dieser Konfiguration bekommen kann, ist die Login-Aktion (die die "Login" -Ansicht zurückgibt), und ich nehme an, dass der MVC mir diese Aktion erlaubt, weil ich ihn als Login eingestellt habe URL in meiner web.config.

Hier ist meine Web-Config-Konfiguration:

 <authentication mode="Forms"> 
     <forms loginUrl="~/Login/Login" timeout="2880" /> 
    </authentication> 

Alle anderen Aktionen auf die Login-Aktion umgeleitet werden. Bei dieser Konfiguration kann ich keine anderen wichtigen Aktionen wie Passwort wiederherstellen, Registrierung usw. durchführen.

Was mache ich falsch?

+0

Sie können nicht global leugnen - pasword Wiederherstellung oder Registrierung muss anonym zugegriffen werden. –

+0

Was muss ich ändern? Wenn ich anonymen Zugriff zulasse, ist die gesamte Site zugänglich und MVC leitet den nicht authentifizierten Benutzer nicht zur Anmeldeaktion um. – Shahar

+0

Siehe meine Antwort .. –

Antwort

14

verwenden Sie globale Authentifizierung Filter mit benutzerdefinierten Verhalten statt Berechtigungs Konfiguration in web.config (am besten für MVC)

hinzufügen globalen Filter

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new AuthorizeAttribute()); 
    } 
} 

Dann funktioniert [AllowAnonymous] und alle anderen Controller und Aktionen erfordern die Autorisierung.

+0

Können Sie ein Beispiel geben? – Shahar

+0

..edited zum Beispiel – hVostt

+0

Danke!Erwähnenswert: Nachdem Sie den autorisierten Filter hinzugefügt haben, benötigen Sie (wie ich) einen anonymen Zugriff auf Ihre Site. – Shahar

0

Haben Sie versucht, die anonyme Berechtigung für die URL wie in der Probe unter

<location path="Login/Login"> 
    <system.web> 
     <authorization> 
      <allow users="*" /> 
     </authorization> 
    </system.web> 
</location> 

Ähnlich wie diese, damit Sie für die Resetpassword/Restore Passwort werden Einstellung sollte/Registrieren etc ...

+0

Die Dekoration erreicht nicht das gleiche Verhalten? – Shahar

1

Es gibt zwei mögliche Ansätze.

Erstens - Sie können anonyme Anfragen global mit dem Autorize-Attribut ablehnen und diese wenigen markieren, die keine Autorisierung mit AllowAnonymous-Attribut benötigen (was neu in MVC4 ist).

Zweitens - nicht global verweigern, sondern sichern Sie Ihre ausgewählten Controller/Aktionen mit Autorize-Attribut.

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new AuthorizeAttribute()); 
} 

Und dann mit dem AllowAnonymous Attribut Aktion Methoden, die den anonymen Zugriff benötigen:

+0

Dies ist nicht korrekt in Bezug auf Ihren ersten Ansatz: Wenn Sie anonyme Anfragen verweigern und den Autorisierungsfilter nicht hinzufügen, Sie werden außer der Login-Aktion keine Aktion ausführen können und das Attribut AllowAnonymous wird von der MVC nicht berücksichtigt. – Shahar

+0

Ich war nicht klar genug, die Ablehnung sollte natürlich mit Authorize erfolgen. Ich hoffe, die bearbeitete Version ist klar. Vielen Dank. –

11

Sie können auch Authorize Filter in RegisterGlobalFilters Methode registrieren

[Authorize] 
public class AccountController : Controller 
{ 
    [AllowAnonymous] 
    public ActionResult RecoverPassword() 
    { 
    ... 
    } 
} 
+1

Danke, hVostt war 2 Minuten vor dir – Shahar

+0

Kein Problem. Freut mich, dass du deine Antwort bekommen hast :) – Kamyar