2009-06-05 9 views
2

Donc, je viens d'un arrière-plan ASP.NET 2.0 WebForms et je suis nouveau à ASP.NET MVC, que je trouve merveilleux, cependant, j'ai été accostumed à cela.Comment faire redirection d'autorisation sur ASP.NET MVC

Cette fois-ci, mon problème a à voir avec le modèle d'authentification et d'autorisation:

je restreindre les dossiers via la section d'autorisation de Web.config

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

Ainsi, lorsqu'un utilisateur tente d'accéder à un privé " page "être redirigé vers la page d'index; Comment puis-je faire cela sur MVC? J'avais l'habitude d'enregistrer l'id (ou l'objet) d'utilisateur dans les données de session ... maintenant je ne sais pas comment ou où le stocker, d'une manière MVC'ish.

Comme une note de côté, mon modèle de données a une table comme ceci:

CREATE TABLE user_perm (
    user INT, 
    feature INT, 
) 

Et je voudrais limiter l'accès à certains contrôleurs en fonction du contenu de ce tableau. Comment puis-je y arriver? PS: Je suis au courant de ces autres questions, mais ils se réfèrent à la version bêta et je ne sais pas encore si elle s'applique à la version actuelle.

Merci d'avance

+0

S'il vous plaît voir ma réponse, vous devriez être en mesure de modifier l'attribut RequiresRole pour répondre à vos besoins spécifiques pour autoriser l'accès. – Ropstah

Répondre

3

Vous devriez essayer le filtrage des attributs sur les actions du contrôleur. (Voir le lien this pour de bonnes informations.)

Les actions du contrôleur vous dirigent vers des «pages» réelles, vous devriez les sécuriser.

Ce que j'utilise (attribut personnalisé ...):

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 

Et l'attribut d'autorisation:

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

Désolé, je vais bien sur VB :). J'aime vraiment les constructions C#/Javascript et vraiment HATE la marque de continuation de ligne _ pour VB. Mais VB est parfaitement lisible pour moi. Vive pour intellisense hehe – Ropstah

2

utiliser l'attribut Autorisez. Vous pouvez le placer sur des actions individuelles ou sur le contrôleur entier.

[Authorize(Roles="admin")] 

Plus d'informations ici:

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

+0

Et comment le faire en fonction de la table user_perm? devrais-je hériter Authorize? –

+0

Vous devez créer un attribut personnalisé. S'il vous plaît voir ma réponse avec l'exemple d'attribut personnalisé .... – Ropstah

+0

Oui, j'utilise mon propre attribut personnalisé pour mes affaires - consultez l'exemple de ropstah. –

1

Ils ROUAGES manipulation est par attributs.

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

« [Authorize] » est equvalent à « [Authorize (rôles = "utilisateur")] ». Pour des rôles spécifiques, utilisez [Authorize (Roles = "")].

Questions connexes