2009-06-26 12 views
7

Ich habe eine ASP.Net-Website mit mehreren Rollen, jede mit Zugriff auf ein separates Verzeichnis (d. H. Admin Benutzer können auf/Admin zugreifen, Käufer können/Shop usw.), mit einer gemeinsamen Anmeldeseite. Wenn jemand die Anmeldeseite mit der Rückkehr-URL besucht, die auf ein Verzeichnis festgelegt ist, auf das er keinen Zugriff hat (z. B. besucht ein Käufer /login.aspx?returnurl=/admin/index.aspx), kann sich der Benutzer erfolgreich authentifizieren (die Anmeldedaten sind gültig), aber sie landen auf der Anmeldeseite (sie haben keinen Zugriff auf die angeforderte Seite).Ermitteln, ob Benutzer auf die angeforderte Seite zugreifen kann?

Wie hole ich das auf, damit ich eine Nachricht anzeigen kann, den Benutzer?

Antwort

2

Ich landete tun dies in dem Ereignis Page Load von der Login-Seite auf:

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

Das denkende Wesen, wenn ein authentifizierter Benutzer auf der Login-Seite landet, haben sie entweder ihr als Ergebnis abgeschickt versuchen, auf eine Seite zuzugreifen, zu deren Anzeige sie nicht berechtigt sind, oder sie haben sich authentifiziert und sind dann manuell zur Anmeldeseite gegangen (unwahrscheinlich).

Eine weitere Aktion wäre, den Benutzer auf die Anmeldeseite zu der entsprechenden Homepage zu senden, wenn sie bereits authentifiziert sind.

+0

Dies ist nur eine Teillösung, die am besten geeignet ist, wenn Sie nicht über verschiedene Rollen verfügen, die auf verschiedene Seiten zugreifen können. Wenn Sie dies tun, können Sie einen Benutzer haben, der authentifiziert ist, aber immer noch nicht auf ReturnUrl zugreifen kann, was möglicherweise zu einer Umleitungsschleife führt. –

+0

Andrey Antwort sollte als die richtige Antwort markiert werden. – EtienneT

+0

Authentifizierung und Autorisierung sind völlig unterschiedliche Konzepte ... –

0

Sie können ihn auf der Indexseite umleiten, ihm zu sagen, dass er nicht die Seite zugreifen kann;)

+0

Woher weiß ich, dass er nicht auf diese Seite zugreifen kann? Ich kann feststellen, welche Rolle er ist, aber nicht welche Rolle kann die angeforderte Seite zugreifen. – user9659

+0

Nun sollten Sie etwas wie Ebenen machen. Wenn Sie über Level 4 sind, können Sie auf die Seite zugreifen. Oder mit Rollen sollten Sie auf jeder Seite eine bestimmte Rolle zuweisen, die auf diese Seite zugreifen kann. – Timotei

1

Wenn Sie verschiedene Verzeichnisse haben und Sie verwenden asp.net Authentifizierung ist es sehr einfach. Alles, was Sie brauchen, ist web.config-Datei in jedem Verzeichnis zu setzen und Rollen definieren, welche Dateien in diesem Verzeichnis wie folgt zugreifen können:

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

Sie mehr Details von this Artikel auf MSDN

bekommen können Sie setzen alle in Haupt web.config wie folgt aus:

<!-- 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> 

Dies ist aus this Artikel auf MSDN :)

EDIT:

In Ihrer Seite Load-Methode dies tun:

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

Hoffnung, dies helfen Sie!

+0

Die Website ist bereits in der gleichen Weise eingerichtet, wie Sie es geschrieben haben - aber was Sie gepostet haben, scheint meine Frage in keiner Weise zu beantworten. – user9659

+0

Okay Jetzt habe ich Sie, die Verwendung ist authentifiziert, aber nicht berechtigt, diese Seite zu sehen! Ich habe meine Antwort bearbeitet – TheVillageIdiot

+0

Die Methode page_load auf der Seite, die von returnurl angegeben wird, wird nicht ausgelöst, da der Benutzer nicht so weit kommt, wie sie nicht autorisiert sind. Das Konzept ist genau das, was ich tun möchte. – user9659

1

Eine Möglichkeit wäre, OnLoad Ihrer aspx-Formulare zu überschreiben und zu überprüfen, ob der authentifizierte Benutzer Zugriff auf die Ressource basierend auf der Rolle hat. So erstellen Sie eine BasePage.cs (in dem Sie eine Klasse Basepage definieren, die von System.Web.UI.Page erbt) zum Beispiel, von dem alle Formulare (aspx) erben, in denen Sie dies tun:

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); 
} 

Dann in Ihrer UrlHelper Klasse, die Sie brauchen, dass IsAccessible Funktion oben verwendet:

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; 
} 

Hier wird bei IsAnonymousAllowed Sie sich gefragt:

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

Nun, warum Sie nicht fangen das Verzeichnis im Login-pa ge? Wenn die Anmeldeseite feststellen kann, auf welches Verzeichnis der Benutzer zugreifen möchte, können sie möglicherweise basierend auf der Rolle auf die richtige Seite umgeleitet werden. Wenn jemand versucht, zu/admin zu gehen, und die Authentifizierung erfolgreich ist, können Sie überprüfen, ob sie dort Zugriff haben. Falls nicht, können Sie entweder auf die einfache Zielseite umleiten, um anzuzeigen, dass sie keinen Zugriff haben, oder Sie leiten sie auf die Zielseite der Rolle um.

EDIT: Sie könnten wahrscheinlich die Umleitung im LoggedIn-Ereignis des Steuerelements tun.

0

Eine andere Option besteht darin, eine Sitzungsvariable festzulegen, wenn Sie Rechte überprüfen und diese auf der Anmeldeseite anzeigen.

So könnten Sie tun:

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

dann in der Login-Seite:

if (session("denied") != "") { 
    message.text = session("denied"); 
    session("denied") = ""; 
} 
Verwandte Themen