Comment rediriger les utilisateurs vers un ASP.NET page non autorisée?

j'ai besoin que mes utilisateurs soient redirigés vers AuthError.page aspx ("Vous n'avez pas accès à cette page") dans le cas où ils sont authentifiés, mais essayez d'accéder à la page qu'ils ne peuvent pas accéder (en raison du rôle de l'examen). Si je mets en place le web.config:

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

c'est le système qui est mauvais comportement parce qu'un utilisateur est déjà authentifié et il n'est pas nécessaire de rediriger vers cette page. Mais si J'écris ici AuthError.aspx à la place de Login.aspx comment puis-je rediriger un utilisateur non encore authentifié vers la page de connexion?

21
demandé sur John Saunders 2011-01-29 03:53:15

6 réponses

sur la Page_Load de votre page de connexion, vous voudrez vérifier si l'utilisateur est authentifié, et s'ils doivent 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 obtenir un peu plus de fantaisie, vous pouvez vérifier le paramètre Returl pour déterminer si l'utilisateur est venu à la page directement (comme par le biais d'un signet qu'ils ont enregistré droit à la page de connexion) et gérer cela 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
répondu Joel Beckham 2011-08-05 20:36:54

pour moi, la solution la plus avantageuse à ce problème a été de créer une autre section (panel) dans Login.page aspx avec contenu à afficher pour les utilisateurs qui sont authentifiés (par ex. connectés) en disant "Accès refusé" au lieu du formulaire de connexion. Lorsque les utilisateurs connectés accèdent à la page, cela signifie qu'ils ont très probablement fini ici parce qu'ils ne sont pas authentifiés pour accéder à la page qui les a redirigés ici.

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

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

c'est très simple et ça marche.

2
répondu Filip 2017-02-13 21:33:19

Vous avez besoin de:

1) activer les rôles (dans web.config): (remplacer " xxx " avec 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. J'ai en fait répondu à une autre question aujourd'hui où j'explique comment y parvenir. ici est le lien

1
répondu santiagoIT 2017-05-23 11:47:04

vous devez faire une distinction entre authentification et autorisation. Votre extrait de code s'adresse au premier ("suis-je connu de ce site") mais pas au second ("suis-je autorisé à accéder à cette page").

comme le suggère @santiagoIT, 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, de sorte que vous pouvez les utiliser pour afficher du contenu différent en fonction du rôle que l'utilisateur est dans.

une approche courante consiste à afficher des menus différents pour les utilisateurs dans les différents rôles, de sorte qu'ils ne soient présentés qu'avec des menus qui sont pertinents pour leurs rôles - LoginView est souvent utilisé pour cela.

alternativement vous pouvez contrôler la visibilité du contenu sur des pages individuelles, encore une fois en utilisant LoginView, de sorte que les utilisateurs qui ne sont pas authentifiés reçoivent un message, ceux qui sont authentifiés mais pas autorisés à voir la page une seconde message et ceux qui sont à la fois authentifiés et autorisés à voir la page voir le contenu.

si vous voulez simplement rediriger un utilisateur qui est authentifié mais n'a pas l'accès requis pour voir une page, vous pouvez également vérifier que l'utilisateur est le rôle approprié (rôles.IsUserInRole) et rediriger vers le "vous n'avez pas accès.."la page si ce n'.

si vous êtes vraiment conscient de la sécurité, Vous pouvez combiner le menu restreint / vue approche avec contrôle d'autorisation sur chaque page.

1
répondu SimonF 2011-01-29 22:24:29

essayez ceci:

supposons que vous n'ayez besoin que des utilisateurs admin pour accéder à votre page spécifiée, alors dans le fichier page_load vous pouvez écrire ceci:

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

}

et dans le cas où vous utilisez des routes, vous pouvez faire:

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

}
0
répondu Lucky 2013-05-19 09:55:41

vous pouvez définir une page d'erreur personnalisée comme ceci:

<system.web>
  <customErrors mode="On">        
    <error statusCode="403" redirect="AuthError.aspx" />      
  </customErrors>
</system.web>
-1
répondu kolbasov 2011-01-29 06:20:13