2009-06-05 15 views
2

Also, ich komme aus einem ASP.NET 2.0 WebForms Hintergrund und bin neu zu ASP.NET MVC, die ich finde es wunderbar, aber ich habe es etwas accostumed.Autorisierung Umleitung auf ASP.NET MVC

Dieses Mal mein Problem hat mit der Authentifizierung und Autorisierung Modell zu tun:

I verwendet beschränken Ordner über Web.config Autorisierungs Abschnitt

<authorization> 
     <deny users="?"/> 
     <!-- 
     <allow users="*"/> 
    --> 
    </authorization> 

Also, wenn ein Benutzer eine private zuzugreifen versucht " Seite "wird zur Indexseite umgeleitet; Wie kann ich dies auf MVC tun? Ich habe die Benutzer-ID (oder das Objekt) in den Sitzungsdaten gespeichert ... jetzt weiß ich nicht, wie oder wo ich sie auf MVC-Art speichern soll.

Als Randbemerkung, hat meine Datenmodell eine Tabelle wie folgt aus:

CREATE TABLE user_perm (
    user INT, 
    feature INT, 
) 

Und ich möchte den Zugang zu bestimmten Controller auf den Inhalt dieser Tabelle basiert beschränken. Wie kann ich es erreichen?

PS: Ich bin mir dieser anderen Fragen bewusst, aber sie beziehen sich auf die Beta-Version und ich bin mir nicht sicher, ob sie noch auf die aktuell veröffentlichte Version zutreffen.

Vielen Dank im Voraus

+0

Bitte beachten Sie meine Antwort, Sie sollten in der Lage sein, das RequiresRole-Attribut zu ändern, um Ihre spezifische Anforderung für den Zugriff zu erfüllen. – Ropstah

Antwort

3

Sie sollten Filterung auf Controller-Aktionen versuchen zuzuschreiben. (Siehe this Link für gute Informationen.)

Controller-Aktionen zeigen Sie auf tatsächliche 'Seiten', sollten Sie diese zu sichern.

Was ich (benutzerdefinierte Attribute ...):

Public Class ProjectController 
    Inherits System.Web.Mvc.Controller 

    <Models.Authentication.RequiresAuthentication()> _ 
    Function Edit(ByVal id As Integer) As ActionResult 

    End Function 

    <Models.Authentication.RequiresRole(Role:="Admin")> _ 
    Function Delete(ByVal id As Integer) As ActionResult 

    End Function 
End Class 

Und die Genehmigung Attribut:

Namespace Models.Authentication 
    Public Class RequiresAuthenticationAttribute : Inherits ActionFilterAttribute 
     Public Overrides Sub OnActionExecuting(ByVal filterContext As System.Web.Mvc.ActionExecutingContext) 
      If Not filterContext.HttpContext.User.Identity.IsAuthenticated Then 
       Dim redirectOnSuccess As String = filterContext.HttpContext.Request.Url.AbsolutePath 
       Dim redirectUrl As String = String.Format("?ReturnUrl={0}", redirectOnSuccess) 
       Dim loginUrl As String = FormsAuthentication.LoginUrl + redirectUrl 

       filterContext.HttpContext.Response.Redirect(loginUrl, True) 
      End If 
     End Sub 
    End Class 

    Public Class RequiresRoleAttribute : Inherits ActionFilterAttribute 
     Private _role As String 

     Public Property Role() As String 
      Get 
       Return Me._role 
      End Get 
      Set(ByVal value As String) 
       Me._role = value 
      End Set 
     End Property 

     Public Overrides Sub OnActionExecuting(ByVal filterContext As System.Web.Mvc.ActionExecutingContext) 
      If Not String.IsNullOrEmpty(Me.Role) Then 
       If Not filterContext.HttpContext.User.Identity.IsAuthenticated Then 
        Dim redirectOnSuccess As String = filterContext.HttpContext.Request.Url.AbsolutePath 
        Dim redirectUrl As String = String.Format("?ReturnUrl={0}", redirectOnSuccess) 
        Dim loginUrl As String = FormsAuthentication.LoginUrl + redirectUrl 

        filterContext.HttpContext.Response.Redirect(loginUrl, True) 
       Else 
        Dim hasAccess As Boolean = filterContext.HttpContext.User.IsInRole(Me.Role) 
        If Not hasAccess Then 
         Throw New UnauthorizedAccessException("You don't have access to this page. Only " & Me.Role & " can view this page.") 
        End If 
       End If 
      Else 
       Throw New InvalidOperationException("No Role Specified") 
      End If 

     End Sub 
    End Class 
End Namespace 
+1

ewww VerBose.net: P –

+1

Sorry, ich gehe weit zurück auf VB :). Ich mag wirklich C#/Javascript-Konstrukte und hasse wirklich die Zeilenfortsetzungsmarkierung _ für VB. Aber VB ist für mich perfekt lesbar. Hurra für Intellisense hehe – Ropstah

2

das Attribut Autorisieren verwenden. Sie können es auf einzelne Aktionen oder auf den gesamten Controller legen.

[Authorize(Roles="admin")] 

Weitere Informationen hier:

http://forums.asp.net/p/1428467/3192831.aspx

+0

Und wie es auf der Tabelle user_perm zu tun? Soll ich Authorize erben? –

+0

Sie sollten ein benutzerdefiniertes Attribut erstellen. Bitte sehen Sie meine Antwort mit dem benutzerdefinierten Attribut Beispiel .... – Ropstah

+0

Ja, ich benutze mein eigenes benutzerdefiniertes Attribut für meine Sachen - sehen Sie sich Ropstahs Beispiel an. –

1

Sie Art, wie wir es sind, ist die Handhabung durch Attribute.

[Authorize] 
    public ActionResult SomeAction() { 
     return View(); 
    } 

„[autorisieren]“ ist auf Vorbehalte, „[autorisieren (Rollen = "user")]“. Für bestimmte Rollen verwenden Sie [Autorisieren (Rollen = "")].

Verwandte Themen