Domanda

Ho un sito Web ASP.Net con più ruoli, ognuno con accesso a una directory separata (ovvero gli utenti amministratori possono accedere / admin, gli acquirenti possono accedere / acquistare ecc.), utilizzando una pagina di accesso condivisa. Se qualcuno visita la pagina di accesso con l'URL di ritorno impostato su una directory a cui non ha accesso (ad es. Un acquirente visita /login.aspx?returnurl=/admin/index.aspx), l'utente può autenticarsi correttamente (le credenziali di accesso sono valido), ma tornano alla pagina di accesso (non hanno accesso alla pagina richiesta).

Come lo raccolgo, così posso visualizzare un messaggio che l'utente fa?

È stato utile?

Soluzione 2

Ho finito per farlo nell'evento page_load della pagina di accesso:

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

L'essere pensante, se un utente autenticato finisce nella pagina di accesso, è stato inviato il proprio come risultato del tentativo di accedere a una pagina che non è autorizzato a visualizzare, oppure si è autenticato e quindi è andato manualmente alla pagina di accesso (improbabile).

Un'ulteriore azione sarebbe quella di inviare l'utente alla home page pertinente ogni volta che visitano la pagina di accesso, se sono già autenticati.

Altri suggerimenti

UrlAuthorizationModule.CheckUrlAccessForPrincipal()

è ciò che è necessario utilizzare per testare l'accesso dell'utente a una posizione (pagina o cartella) ( http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx )

Un approccio sarebbe quello di sovrascrivere OnLoad dei moduli aspx e verificare se all'utente autenticato è consentito l'accesso alla risorsa in base al ruolo. Quindi crei un BasePage.cs (in cui definisci una classe BasePage che eredita da System.Web.UI.Page) ad esempio da cui ereditano tutti i tuoi Form (aspx), in cui lo fai:

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

Quindi nella tua classe UrlHelper hai bisogno della funzione IsAccessible usata sopra:

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

Ecco IsAnonymousAllowed nel caso te lo chiedessi:

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

Se hai directory diverse e stai usando l'autenticazione asp.net è molto semplice. Tutto ciò che serve è inserire il file web.config in ogni directory e definire i ruoli che possono accedere ai file in quella directory in questo modo:

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

Puoi ottenere maggiori dettagli da questo articolo su MSDN

Puoi impostare tutto in web.config principale in questo modo:

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

Questo è tratto da questo articolo su MSDN:)

EDIT:

Nel metodo di caricamento della pagina, procedere come segue:

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

Spero che questo ti aiuti!

Puoi reindirizzarlo sulla pagina dell'indice, dicendogli che non può accedere a quella pagina;)

Bene, perché non catturi la directory nella pagina di accesso? Se la pagina di accesso può determinare a quale directory l'utente sta tentando di accedere, forse può reindirizzare alla pagina giusta in base al ruolo. Se qualcuno tenta di accedere a / admin e l'autenticazione ha esito positivo, puoi verificare se hanno accesso lì. In caso contrario, puoi reindirizzare alla pagina di destinazione di base indicando che non hanno accesso o reindirizzarli alla pagina di destinazione del ruolo.

EDIT: Probabilmente potresti eseguire il reindirizzamento nell'evento LoggedIn del controllo.

Un'altra opzione è quella di impostare una variabile di sessione quando si controllano i diritti e la si visualizza sulla pagina di accesso.

Quindi potresti fare:

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

Quindi nella pagina di accesso:

if ( session("denied") != "" ) {
   message.text = session("denied");
   session("denied") = "";
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top