[ASP.NET] dynamisch url loginform

Pagina: 1
Acties:

  • Shane007
  • Registratie: Februari 2012
  • Laatst online: 16-01 12:02
Ik ben bezig met een multi-tentant website in VS2013. Ik maak gebruik van een masterpage om de header en footer op iedere pagina in te laden, hier zit tevens de default login form van asp in. Ik gebruik verder de asp web site administration tool om gebruikers en rollen te definiëren. Nu kan ik via de (home) index.aspx inloggen en kom netjes op de beveiligde pagina. Ik heb echter 2 problemen:

Het login-form staat op elke pagina (in de header), dus niet alleen op index.aspx. Hoe kan ik dit dynamisch in de web.config plaatsen zodat van elke pagina ingelogd kan worden.

Verder is het belangrijk dat iedere user inlogt en naar zijn aparte pagina gestuurd wordt. Kort gezegd: ik wil dat gebruiker A naar pagina X wordt gelinkt als deze is ingelogd, gebruiker B naar Y enz.

Dit is (deels) mijn web.config file:

<authentication mode="Forms">
<forms loginUrl="index.aspx" defaultUrl="/userA/default.aspx"/>
</authentication>

loginUrl is dus de pagina waar men kan inloggen, dit moet niet alleen vanaf index.aspx kunnen maar van iedere willekeurige pagina.

defaultUrl is de pagina waar de ingelogde gebruiker naartoe gelinkt wordt, dit moet dus voor iedere user anders zijn.

Hopelijk heeft iemand hier ervaring mee.

  • Razr
  • Registratie: September 2005
  • Niet online
Je kunt een UserControl maken van je inlogformulier (en code-behind) en deze 'embedden' in andere pagina's (Google eens op "ASP.NET User Controls").

Voor de 'defaultUrl' kun je een generieke pagina gebruiken waar je vervolgens je gebruiker specifieke logica uitvoert en op basis daarvan stuur je 'm door.

Verwijderd

Het is vrij gebruikelijk om een dedicated login pagina te gebruiken. Die kun je configureren via de loginUrl. Wil je echter op de pagina's zelf inloggen (dmv ajax dingetjes enzo) dan kun je inderdaad de loginUrl dynamisch via de code behind zetten.

Hetzelfde geldt overigens voor de defaultUrl. En als dat niet kan, kun je altijd nog een pagina maken die op basis van de gebruikersgegevens redirect.

  • Shane007
  • Registratie: Februari 2012
  • Laatst online: 16-01 12:02
Op dit moment gebruik ik de volgende code om gebruikers door te sturen:

Protected Sub Login1_LoggedIn(ByVal sender As Object, ByVal e As System.EventArgs) Handles Login1.LoggedIn

If Roles.IsUserInRole("A") = True Then

Response.Redirect("~/A/default.aspx")

ElseIf Roles.IsUserInRole("B") = True Then

Response.Redirect("~/B/default.aspx")

Else

Response.Redirect("~/index.aspx")

End If

End Sub

Hier gebruik ik A en B even als dummy. Dit werkt, maar is dit ook 'the way to do it'

Verwijderd

Los van het gegeven dat je dit zeker op een mooiere en onderhoudsvriendelijkere manier kunt bouwen; Ja, in classic asp.net is dit 1 van de manieren om het doen. Er zijn meer wegen, maar met de controls die jij gebruikt wordt dit event toch afgevuurd en hij is bedoeld voor post-login acties (Waar dit toch wel onder valt).

Verwijderd

Shane007 schreef op maandag 24 februari 2014 @ 14:24:
Het login-form staat op elke pagina (in de header), dus niet alleen op index.aspx. Hoe kan ik dit dynamisch in de web.config plaatsen zodat van elke pagina ingelogd kan worden.
Je geeft aan dat je de login control in de MasterPage hebt staan, wat wil je dan dynamisch in de web.config plaatsen? Als je bij al je pagina's gebruik maakt van de MasterPage heb je bij al je pagina's de logincontrol.
Shane007 schreef op maandag 24 februari 2014 @ 15:06:
Op dit moment gebruik ik de volgende code om gebruikers door te sturen:

Protected Sub Login1_LoggedIn(ByVal sender As Object, ByVal e As System.EventArgs) Handles Login1.LoggedIn

If Roles.IsUserInRole("A") = True Then

Response.Redirect("~/A/default.aspx")

ElseIf Roles.IsUserInRole("B") = True Then

Response.Redirect("~/B/default.aspx")

Else

Response.Redirect("~/index.aspx")

End If

End Sub

Hier gebruik ik A en B even als dummy. Dit werkt, maar is dit ook 'the way to do it'
Zijn je rollen altijd gelijk aan de mappen waarnaar je wilt redirecten? dan zou ik gewoon direct redirecten zonder een if then else..

C#:
1
2
Response.Redirect(string.Format("~/{0}/",
              Roles.GetRolesForUser(User.Identity.Name).DefaultIfEmpty("geen").FirstOrDefault());


je zou dan of in je web.config of in een base class voor je ~/{rol}/ pagina's kunnen controleren of de user ook echt toegang mag hebben.

  • Shane007
  • Registratie: Februari 2012
  • Laatst online: 16-01 12:02
De userroles zullen inderdaad hetzelfde zijn als de directory waar ze naartoe gelinkt worden. Dit is inderdaad een betere manier, misschien een VB voorbeeldje :-)

Enig idee hoe ik de loginurl ook aan de control kan meegeven, zodat ik van elke pagina mag inloggen?

Verwijderd

Shane007 schreef op maandag 24 februari 2014 @ 15:45:
De userroles zullen inderdaad hetzelfde zijn als de directory waar ze naartoe gelinkt worden. Dit is inderdaad een betere manier, misschien een VB voorbeeldje :-)

Enig idee hoe ik de loginurl ook aan de control kan meegeven, zodat ik van elke pagina mag inloggen?
uh.. geen idee, ik heb al jaren geen vb meer gedaan.. ik denk dat het niet heel veel zal verschillen, voor de DefaultIfEmpty en FirstOrDefault heb je in ieder geval System.Linq nodig.

Volgens mij kan je "<forms loginUrl="index.aspx" defaultUrl="/userA/default.aspx"/>" weglaten uit je web.config. Je logt in vanuit de MasterPage en niet vanaf 1 bepaalde loginpagina. daarnaast is er ook geen default pagina omdat je die bepaald aan de rol waarin de gebruiker zit.

Mogelijk dat je in de web.config nog
code:
1
2
3
<authorizations>
  <allow users="*" />
</autorizations>

toevoegen, want dan kunnen zowel anonieme als ingelogde gebruikers alle pagina's bereiken.

Je zou dan in de pagina's waarvoor gebruikers ingelogd moeten zijn of in een base class, of global.asax of web.config kunnen instellen dat toegang een rol nodig heeft.

bijv:
code:
1
2
3
4
5
6
7
8
<location path="/A/">
 <system.web>
  <authorization>
   <deny users="*" /> 
   <allow roles="A" />
  </authorization>
 </system.web>
</location>


uit het hoofd, dus zou niet helemaal correct kunnen zijn.

[ Voor 26% gewijzigd door Verwijderd op 24-02-2014 16:00 ]


  • Shane007
  • Registratie: Februari 2012
  • Laatst online: 16-01 12:02
De default waarden heb ik weggelaten uit de web.config file, nog even afgezien van de loginpagina die ik nog dynamisch moet krijgen. Verder maakt de web site administration tool zelf web.config bestanden aan voor de mappen die beveiligd zijn, hierin staat welke users/roles wel of geen toegang krijgen.

Ik ben in ieder geval een stuk opgeschoten, dank daarvoor.

Verwijderd

Shane007 schreef op maandag 24 februari 2014 @ 15:45:
De userroles zullen inderdaad hetzelfde zijn als de directory waar ze naartoe gelinkt worden. Dit is inderdaad een betere manier, misschien een VB voorbeeldje :-)

Enig idee hoe ik de loginurl ook aan de control kan meegeven, zodat ik van elke pagina mag inloggen?
Als je het opzoekt in MSDN dan staat dat daar letterlijk beschreven. En anders even met je intellisense de properties van de logincontrol ed. door want ze zijn beschikbaar (Hint; FormsAuthentication). Deze vraag is namelijk wel erg makkelijk op te zoeken ;)

[ Voor 4% gewijzigd door Verwijderd op 25-02-2014 09:45 ]


  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 14:26
Ik neem aan dat gebruikers als gast op je website mogen snuffelen (Aangezien je de login in je masterpage toont).
Je web.config
<authentication mode="Forms">
<forms loginUrl="index.aspx" defaultUrl="/userA/default.aspx"/>
</authentication>
zorgt ervoor dat je naar een specifieke login pagina gaat. Dat heb jij niet, dus je kan dat verwijderen uit je web.config.

Je moet ook je web.config uitbreiden zoals n_n het beschreven heeft. Eerste gedeelte definieer je dat iedereen welkom is, 2e gedeelte definieer je dat voor locatie A alleen mensen met rol x welkom is.

Dynamische url heb je helemaal niet nodig aangezien je besloten hebt om je login in je masterpage te zetten. Enige wat je nog moet beslissen is naar welke pagina een gebruiker verwezen moet worden nadat ie ingelogd is.
Pagina: 1