Avatar billede cogitans Nybegynder
21. marts 2006 - 11:38 Der er 17 kommentarer og
1 løsning

Redirect af bestemte brugere

Jeg programerer i Visual Studio 2005, og har implementeret noget login i asp.net. Problemet er så, at der kan eksistere normale brugere og administratore. Efter normale brugere har logget sig ind, så forløber alt fint. Men når administratorer har logget ind, så får de samme side, som normale brugere gør. Og det skal de ikke, da jeg har udviklet en seperat masterpage med tilhørende  merudviklet menu, som giver de nødvendige rettigheder. Problemet er så, hvordan man laver et check på, om det er en administrator eller en normal bruger, som logger ind. Og i tilfælde af, at det er en administrator, så skal han redirectes hen til et specieludvalgt side?
Avatar billede ducks Nybegynder
21. marts 2006 - 11:50 #1
Du gemmer vel oplysning om brugerstatus et sted?

Hvis det fx er i databasen, så sætter du bare en session = brugerstatus fra databasen, du vælger samtidig hvilken side man kommer videre til alt efter om han er bruger eller admin, når han kommer ind på admin siden dobbelttjeker du lige ved at se i den session om han er sat til admin.

Sorry, ingen kodeeksempler jeg har ikke styr på asp.net, men jeg håber du kan bruge det alligevel.
Avatar billede dr_chaos Nybegynder
21. marts 2006 - 11:52 #2
i page load kan du sætte
if (User.IsInRole("Administrator"))
            Page.MasterPageFile = "admin.master";
Avatar billede cogitans Nybegynder
21. marts 2006 - 12:20 #3
Nu har jeg sat dette ind:

if (User.Identity.Name.Equals("admin"))
            Server.Transfer("~/Admin/success.aspx");

Og man bliver også redirected hen til den ønkede side. Nu er problemet bare den, at i URL'en står stien til den forkerte fil (altså den fil, som normale brugere ville se i dette tilfælde). Og dette har måske også en del af forklaringen på, hvorfor der åbnes et nyt vindue, når der trykkes på et menupunkt efterfølgende. Der skulle jo ikke åbnes et ny vindue, men derimod skulle der blot kaldes videre ind i sidehierakiet for administratorer (men den dertilhørende masterpage).
Avatar billede dr_chaos Nybegynder
21. marts 2006 - 12:23 #4
if (User.Identity.Name.Equals("admin"))   
Page.MasterPageFile = "admin.master";

så skifter du masterpage filen ud på den enkelte side
men den skal placeres i page_load på alle sider.
Avatar billede cogitans Nybegynder
21. marts 2006 - 12:59 #5
Nu har jeg filerne for administratorer i én mappe, og filer for almindelige brugere i en anden mappe. Og så er der vel ingen grund til at have den kodestump på alle sider? Og der burde da også være muligt, at redirecte en bruger hen i det rigtige miljø ud, ud fra hvilket type bruger han er?
Avatar billede dr_chaos Nybegynder
21. marts 2006 - 13:02 #6
ja
if (User.Identity.Name.Equals("admin"))   
Response.Redirect("Enside");
Avatar billede cogitans Nybegynder
21. marts 2006 - 13:29 #7
Hvis jeg implementerer koden i page_load, så får jeg fejlen:
Egenskaben 'masterpagefile' kan kun angives i eller før hændelsen 'page_preInit'.
Men egentlig skulle det heller ikke være nødvendigt, at angive hvilket masterfil, der skal bruges, da det jo allerede står i den fil, som der redirectes til.
Hidtil har jeg benyttet Server.Transfer(). Nu har jeg prøvet Server.Redirect(). Og når jeg gør det, så står både den gamle sti i urlfeltet og den nye (og rigtige) i urlfeltet. Kan dette være årsagen til fejlen?
Avatar billede dr_chaos Nybegynder
21. marts 2006 - 13:30 #8
prøv med :
if (User.Identity.Name.Equals("admin")) 
Response.Redirect("Enside");
Avatar billede cogitans Nybegynder
21. marts 2006 - 14:40 #9
Det prøver jeg også, men den nye masterpage-fil bliver ikke loaded. Det er stadig den gamle masterpage-fil, der er i brug. Og så opnår man jo ikke det forventede...
Avatar billede cogitans Nybegynder
21. marts 2006 - 15:43 #10
Nu har jeg lavet en fil, som kun tager sig af at redirecte brugeren. Filer ser således ud:

public partial class Login_redirection : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (User.Identity.Name.Equals("admin"))
            {
                System.Diagnostics.Debug.Write("\nEr admin\n");
                Response.Redirect("~/Admin/success.aspx");
            }
            else
            {
                System.Diagnostics.Debug.Write("\nEr ikke admin\n");
                Response.Redirect("~/default.aspx");
            }
        }
        catch(Exception ex) {
            System.Diagnostics.Debug.Write("Fejlen er "+ex.Message.ToString());
            System.Diagnostics.Debug.Write("Indre fejl er " + ex.InnerException.ToString());
        }
    }
}

Når jeg logger ind som administrator nu, så skriver den:
"
Er inde i login/succes.aspx

Er admin
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
Fejlen er Tråden blev afbrudt.A first chance exception of type 'System.NullReferenceException' occurred in App_Web_p82uffcv.dll
The thread  has exited with code 0 (0x0).
The program '[4192] IEXPLORE.EXE: Script program' has exited with code 0 (0x0).
The program '[3368] WebDev.WebServer.EXE: Managed' has exited with code 0 (0x0).
"

Inde i "admin"-mappen har jeg en web.config, hvori der står:
"
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
    <appSettings/>
    <connectionStrings/>
    <system.web>

        <authorization>
          <allow users="admin" />
          <deny users="?" />
        </authorization>
    </system.web>
</configuration>
"
Men
Filen "success.aspx" ligger inde i "Admin", og den kan sagten åbnes inde i editoren. Men hvorfor dør tråden (innerexception: System.NullReferenceError. {Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.}), når den skal have tilgang til denne fil?
Avatar billede dr_chaos Nybegynder
21. marts 2006 - 16:34 #11
Response.Redirect("/Admin/success.aspx");
Response.Redirect("/default.aspx");
Avatar billede cogitans Nybegynder
22. marts 2006 - 09:00 #12
Den giver altså stadigvæk en innerexception:
nullRefereneException
unable to evaluate expression because the code is optimized or a native frame is on top of the call stack
Avatar billede dr_chaos Nybegynder
22. marts 2006 - 10:05 #13
prøv lige med
Response.Redirect("/Admin/success.aspx",true);
Response.Redirect("/default.aspx",true);
Avatar billede cogitans Nybegynder
22. marts 2006 - 16:20 #14
Yes, nu loader den den rigtige masterpage. Jeg skulle godt nok lige tilføje "~" igen. Men...når der trykkes på links i masterpagen, så kommer de frem i et helt nyt vindue. Er dette et helt andet problem, eller udspringer det også i, at siden måske ikke er helt "overbevist" om, at dette faktisk er den nye masterpage?
Avatar billede dr_chaos Nybegynder
22. marts 2006 - 17:36 #15
hvordan ser dine links ud ?
Avatar billede cogitans Nybegynder
23. marts 2006 - 16:02 #16
Mine links ser f.eks. således ud:
~/Normal/Tur.aspx
med Target="ContentPlaceholder1"

Jeg ved ikke, om det evt. har noget at gøre med, at denne side er en masterpage, som faktisk er inde i en anden masterpage?
Avatar billede dr_chaos Nybegynder
23. marts 2006 - 17:28 #17
prøv uden target.
Avatar billede cogitans Nybegynder
19. august 2006 - 17:55 #18
Problemet løstes vha sikkerhedsfunktionalitteten i .Net.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester