Question

J'ai un site Web ASP.Net avec plusieurs rôles, chacun ayant accès à un répertoire distinct (c'est-à-dire que les utilisateurs admin peuvent accéder à / admin, les acheteurs peuvent accéder à / shop, etc.), à l'aide d'une page de connexion partagée. Si une personne visite la page de connexion avec l'URL renvoyée définie dans un répertoire auquel elle n'a pas accès (par exemple, un client visite /login.aspx?returnurl=/admin/index.aspx), l'utilisateur peut s'authentifier avec succès (les informations de connexion sont disponibles). valides), mais ils se retrouvent à la page de connexion (ils n’ont pas accès à la page demandée).

Comment puis-je saisir ceci pour pouvoir afficher un message à l'utilisateur?

Était-ce utile?

La solution 2

J'ai fini par le faire dans l'événement page_load de la page de connexion:

if (User.Identity.IsAuthenticated)
{
    LoginErrorDetails.Text = "You are not authorized to view the requested page";
}

En fait, si un utilisateur authentifié se retrouve sur la page de connexion, il lui a été envoyé suite à une tentative d'accès à une page qu'il n'est pas autorisé à afficher, ou bien il s'est authentifié puis est passé manuellement à la page. page de connexion (peu probable).

Une autre action consisterait à envoyer l'utilisateur sur la page d'accueil appropriée chaque fois qu'il visite la page de connexion, s'il est déjà authentifié.

Autres conseils

UrlAuthorizationModule.CheckUrlAccessForPrincipal()

est ce que vous devez utiliser pour tester l'accès des utilisateurs à un emplacement (page ou dossier) ( http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx )

Une approche serait de remplacer OnLoad de vos formulaires aspx et de vérifier si l'utilisateur authentifié est autorisé à accéder à la ressource en fonction du rôle. Vous créez donc un fichier BasePage.cs (dans lequel vous définissez une classe BasePage qui hérite de System.Web.UI.Page), par exemple, duquel tous vos formulaires (aspx) héritent, dans lequel vous procédez ainsi:

protected override void OnLoad(EventArgs e)
{
    InitializeSitemap();
    if (SiteMap.CurrentNode != null)
    {
        if (!UrlHelper.IsAnonymousAllowed(SiteMap.CurrentNode) && (!HttpContext.Current.User.Identity.IsAuthenticated || !UrlHelper.IsAccesible(SiteMap.CurrentNode)))
        {
            // You can redirect here to some form that has a custom message
            Response.Redirect("~/Forms/Logout.aspx");

            return;
        }
    }
    base.OnLoad(e);
}

Ensuite, dans votre classe UrlHelper, vous avez besoin de la fonction IsAccessible utilisée ci-dessus:

public static bool IsAccesible(SiteMapNode node)
{
    bool toRole = false;

    foreach (string role in node.Roles)
    {
        if (role == "*" || HttpContext.Current.User.IsInRole(role))
        {
            toRole = true;
        }
    }

    return toRole;
}

Voici IsAnonymousAllowed au cas où vous vous demanderiez:

public static bool IsAnonymousAllowed(SiteMapNode node)
{
    return node[AllowAnonymousAttribute] != null ? bool.Parse(node[AllowAnonymousAttribute]) : false;
}

Si vous avez plusieurs annuaires et que vous utilisez l'authentification asp.net, c'est très simple. Tout ce dont vous avez besoin est de placer le fichier web.config dans chaque répertoire et de définir les rôles qui peuvent accéder aux fichiers de ce répertoire comme ceci:

<authorization>
    <allow roles="shoppers"/>
    <deny  users="?"/>
</authorization>

Vous pouvez obtenir plus de détails à partir de cet article . sur MSDN

Vous pouvez définir tout dans le fichier web.config principal comme suit:

    <!-- Configuration for the "sub1" subdirectory. -->
      <location path="sub1">
        <system.web>
          <httpHandlers>
            <add verb="*" path="sub1" type="Type1"/>
            <add verb="*" path="sub1" type="Type2"/>
          </httpHandlers>
        </system.web>
      </location>

      <!-- Configuration for the "sub1/sub2" subdirectory. -->
      <location path="sub1/sub2">
        <system.web>
          <httpHandlers>
            <add verb="*" path="sub1/sub2" type="Type3"/>
            <add verb="*" path="sub1/sub2" type="Type4"/>
          </httpHandlers>
        </system.web>
      </location>
    </configuration>

Il s'agit de cet article sur MSDN:)

EDIT:

Dans votre méthode de chargement de page, procédez comme suit:

if(!User.IsInRole("shopper"))
{
    lblNoAccess.Visible=true;
    lnkHome.Url="PATH_TO_HOME_PAGE_OF_THIS_ROLS";
}

J'espère que cela vous aide!

Vous pouvez le rediriger sur la page d'index en lui indiquant qu'il ne peut pas accéder à cette page;)

Eh bien, pourquoi ne pas récupérer le répertoire dans la page de connexion? Si la page de connexion peut déterminer le répertoire auquel l'utilisateur tente d'accéder, peut-être qu'il pourra être redirigé vers la bonne page en fonction du rôle. Si quelqu'un essaie d'accéder à / admin et que l'authentification réussit, vous pouvez vérifier s'il y a accès. Sinon, vous pouvez soit rediriger vers la page d'arrivée de base en indiquant qu'ils n'ont pas accès, soit les rediriger vers la page d'arrivée du rôle.

EDIT: Vous pouvez probablement effectuer la redirection dans l'événement LoggedIn du contrôle.

Une autre option consiste à définir une variable de session lorsque vous vérifiez les droits et que vous l'affichez sur la page de connexion.

Vous pourriez donc faire:

if(!User.IsInRole("shopper"))
{
    session("denied") = "You don't have access to shop";
    response.redirect("/login");
}

Ensuite, dans la page de connexion:

if ( session("denied") != "" ) {
   message.text = session("denied");
   session("denied") = "";
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top