Frage

Ich habe eine ASP.Net Website mit mehreren Rollen, die jeweils mit Zugang zu einem separaten Verzeichnis (das heißt Admin-Benutzer / admin zugreifen kann, kann Käufer Zugang / shop etc), eine gemeinsame Anmeldeseite verwenden. Wenn jemand die Login-Seite mit der Rückkehr URL besucht auf ein Verzeichnis haben sie keinen Zugriff auf (zB ein Käufer Besuche /login.aspx?returnurl=/admin/index.aspx), kann der Benutzer authentice erfolgreich (die Anmeldeinformationen sind gültig), aber sie am Ende wieder auf der Login-Seite nach oben (sie haben keinen Zugriff auf die Seite, die sie angefordert haben).

Wie hole ich das nach oben, so kann ich eine Nachricht nicht den Benutzer angezeigt werden?

War es hilfreich?

Lösung 2

I ended 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 Denken ist, wenn ein authentifizierter Benutzer auf der Login-Seite landet, haben sie entweder ihr als Folge gesendet wurde der Versuch, eine Seite zuzugreifen, sie sind nicht zu sehen autorisiert, oder sie haben authentifiziert und dann manuell die gegangen Login-Seite (unwahrscheinlich).

Eine weitere Maßnahme wäre, den Benutzer auf die entsprechende Homepage zu senden, wenn sie die Login-Seite besuchen, wenn sie bereits authentifiziert werden.

Andere Tipps

UrlAuthorizationModule.CheckUrlAccessForPrincipal()

ist, was Sie verwenden müssen, um den Benutzerzugriff auf eine Position (Seite oder einen Ordner) ( http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx )

Ein Ansatz wäre OnLoad Ihre aspx Formen außer Kraft zu setzen und prüfen, ob der authentifizierte Benutzer Zugriff auf die auf der Rolle basierten Ressourcen erlaubt ist. So erstellen Sie eine BasePage.cs (, in dem Sie eine Klasse definieren, die Basepage von System.Web.UI.Page erbt) zum Beispiel, aus dem alle Formulare (aspx) erben, in dem 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 ist IsAnonymousAllowed falls Sie sich gefragt:

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

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 definieren Rollen, die Dateien in diesem Verzeichnis wie folgt zugreifen können:

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

Sie können weitere Informationen erhalten, von diesem Artikel auf MSDN

Sie können alle in Haupt web.config wie folgt festgelegt:

    <!-- 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 von diesem Artikel auf MSDN:)

EDIT:

Ihre Seite zu laden Methode, dies tun:

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

Hope this helps Sie!

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

Nun, warum Sie nicht das Verzeichnis, in der Login-Seite fangen? Wenn die Anmeldeseite bestimmen können, welches Verzeichnis der Benutzer zuzugreifen versucht, vielleicht können sie auf die richtige Seite basierend auf Rolle erhalten umleiten. Wenn jemand / admin zu gehen versucht, und die Authentifizierung erfolgreich ist, können Sie überprüfen, ob sie dort Zugang tun haben. Wenn nicht, können Sie entweder umleiten zu grundlegenden Zielseite anzeigt, dass sie keinen Zugang haben oder Sie leiten Sie sie auf die Zielseite der Rolle.

EDIT: Sie könnten wahrscheinlich in der LoggedIn Fall der Kontrolle das Umleiten tun.

Eine andere Möglichkeit ist, ein Session-Variable zu setzen, wenn Sie Rechte sind die Überprüfung und die Anzeige, dass auf der Login-Seite.

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") = "";
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top