web-dev-qa-db-fra.com

Comment rediriger des utilisateurs vers une page ASP.NET sans autorisation?

J'ai besoin que mes utilisateurs soient redirigés vers la page AuthError.aspx ("Vous n'avez pas accès à cette page") dans le cas où ils sont authentifiés mais tentez d'accéder à la page à laquelle ils ne peuvent pas accéder (à cause du rôle à examiner) . Si je configure alors web.config:

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

c'est le comportement incorrect du système car un utilisateur est déjà authentifié et il n'est pas nécessaire de le rediriger vers cette page. Mais si j'écris ici AuthError.aspx à la place de Login.aspx, comment pourrais-je rediriger un utilisateur non encore authentifié vers la page de connexion?

21
mimic

Sur le Page_Load de votre page de connexion, vous voudrez vérifier si l'utilisateur est authentifié et s'il doit les rediriger vers votre page d'accès refusé:

protected void Page_Load(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated) // if the user is already logged in
    {
            Response.Redirect("~/AccessDenied.aspx");
    }
}

Si vous voulez être un peu plus sophistiqué, vous pouvez vérifier le paramètre ReturnUrl pour déterminer si l'utilisateur est venu directement sur la page (par exemple, via un signet enregistré directement dans la page de connexion) et le gérer différemment. Voici un exemple:

protected void Page_Load(object sender, EventArgs e)
    {
        if (User.Identity.IsAuthenticated)
        {

            // if they came to the page directly, ReturnUrl will be null.
            if (String.IsNullOrEmpty(Request["ReturnUrl"]))
            {
                 /* in that case, instead of redirecting, I hide the login 
                    controls and instead display a message saying that are 
                    already logged in. */
            }
            else
            {
            Response.Redirect("~/AccessDenied.aspx");
            }
        }
    }
24
Joel Beckham

Pour moi, la solution la plus avantageuse pour ce problème était de créer une autre section (panneau) dans la page Login.aspx avec le contenu à afficher pour les utilisateurs authentifiés (par exemple, connectés) en disant "Accès refusé" au lieu du formulaire de connexion. Une fois connecté, l'utilisateur accède à la page, cela signifie probablement qu'il est arrivé ici parce qu'il n'est pas authentifié pour accéder à la page qui l'a redirigé ici.

Dans la page de connexion, j’utilise ce code très simple pour changer la visibilité du panneau et du formulaire de connexion:

if (Request.IsAuthenticated)
{
    LoginUser.Visible = false;
    AccessDeniedPanel.Visible = true;
}

C'est simple et ça marche.

2
Filip

Tu dois:

1) Activer les rôles (dans web.config): (remplacez 'xxx' par vos propres valeurs)

<roleManager enabled="true">
  <providers>
    <clear />
    <add connectionStringName="ApplicationServices" applicationName="xxx"
      name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
    <add applicationName="xxx" name="AspNetWindowsTokenRoleProvider"
      type="System.Web.Security.WindowsTokenRoleProvider" />
  </providers>
</roleManager>

2) vous devez restreindre l’accès à certaines zones de votre site Web pour des rôles spécifiques . En fait, j’ai répondu à une autre question aujourd’hui, où j’explique comment y parvenir . Ici est le lien.

1
santiagoIT

Vous devez faire la distinction entre authentification et autorisation. Votre extrait de code concerne le premier ("Suis-je connu de ce site") mais pas le dernier ("Puis-je accéder à cette page").

Comme @santiagoIT le suggère, les rôles peuvent être la meilleure solution pour mettre en œuvre l'autorisation dont vous avez besoin. Certains contrôles, tels que LoginView, sont sensibles au rôle et à l'authentification. Vous pouvez donc les utiliser pour afficher un contenu différent en fonction du rôle de l'utilisateur.

Une approche courante consiste à afficher différents menus pour les utilisateurs dans les différents rôles, de manière à ce qu’ils ne se voient présenter que des menus correspondant à leurs rôles - le LoginView est souvent utilisé à cet effet.

Vous pouvez également contrôler la visibilité du contenu sur des pages individuelles, en utilisant à nouveau LoginView, afin que les utilisateurs non authentifiés reçoivent un message, ceux qui sont authentifiés mais non autorisés à afficher la page un deuxième message et ceux qui sont authentifiés et autorisé à voir la page voir le contenu. 

Si vous souhaitez simplement rediriger un utilisateur authentifié mais ne disposant pas de l'accès requis pour afficher une page, vous pouvez également vérifier que l'utilisateur est le rôle approprié (Roles.IsUserInRole) et effectuer une redirection vers .. "page sinon.

Si vous êtes vraiment soucieux de la sécurité, vous pouvez combiner l'approche menu/affichage restreint avec la vérification des autorisations sur chaque page.

1
SimonF

essaye ça : 

supposons que seuls les utilisateurs admin aient accès à la page que vous avez spécifiée. Dans le chargement_page, vous pouvez écrire ceci:

if (User.Identity.IsAuthenticated)
{
   if ( !User.IsInRole("Admin"))
   {
        Server.Transfer("~/AccessDeniedPage.aspx");
   }

}

et si vous utilisez des itinéraires, vous pourriez faire:

if (User.Identity.IsAuthenticated)
{
   if ( !User.IsInRole("Admin"))
   {
        Response.RedirectToRoute("AccessDeniedRoute");
   }

}
0
Lucky