2009-02-12 24 views
7

Jak rozwiązać problem z nieskończoną pętlą logowania podczas korzystania z sesji cookieless i nie można zmienić nazwy login.aspx na httphandler?Formularz logowania Asp.net do uwierzytelniania formularzy

tj. Gdy użytkownik z uprawnieniami administratora natrafi na przycisk wylogowania, a URL powrotu do strony z ograniczeniami zostanie przekazany do login.aspx, wówczas inny użytkownik bez uprawnień administratora spróbuje się zalogować, a następnie zostanie przekierowany z powrotem na stronę logowania.

Natknąłem się na to solution, ale nie mogę zmienić nazwy login.aspx na program obsługi http, a funkcja uwierzytelniana nie działa na stronie aspx z autoodpowiechem cookie, ponieważ wydaje się, że formularz autoryzacji formularzy jest usunięty z adresu URL po przekierowaniu z powrotem do strony logowania.

EDIT:

Ponieważ ta aplikacja jest już w produkcji nie mogę zmieniać przepływ stronę z/wylogowania/procesu limitu czasu logowania lub zmień stronę logowania.

+1

To cholernie dobre pytanie – StevenMcD

+0

Zgadzam się z innymi w aspekcie: jak to naprawić, jeśli nie można nic zmienić? Szukasz rozwiązania tylko zmieniającego plik web.config i nic więcej? Naprawdę nie sądzę, że to możliwe – juan

Odpowiedz

2

Sprawdź, czy użytkownik jest uprawniony do dostępu do strony w witrynie returnUrl, po zalogowaniu się na stronie login.aspx. Można użyć tej metody z UrlAuthorizationModule (lub zwyczaj jeden czy działa najlepiej dla Ciebie):

System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal(

    returnUrl, 
    userPrincipal, 
    GET"); 

Jeśli użytkownik nie jest uprawniony, po prostu przekierować do strony, na której użytkownik może uzyskać dostęp.

Aby uzyskać Principal użytkownika:

var roles = System.Web.Security.Roles.GetRolesForUser(username); 

var principal = new System.Security.Principal.GenericPrincipal(

    new System.Security.Principal.GenericIdentity(username), 

    roles 

); 
+0

Cześć Freddy, to jest dobry pomysł, z tym wyjątkiem, że nie sądzę, że można uzyskać dostęp do uwierzytelnionego obiektu genericprincipal, dopóki bilet formularzy nie zostanie wstawiony do adresu URL. Czy możliwe jest uzyskanie uwierzytelnionego obiektu głównego na stronie logowania w jaki sposób? – Element

+0

Zrobiłem edycję i dodałem przykładowy kod, aby uzyskać GenericIdentity. – eglasius

+0

To działa na pewno, jak poszło? – eglasius

0

Czy możesz zmienić przepływ strony?

Mam na myśli raczej przekierowanie z powrotem na stronę login.aspx, gdy użytkownik nie ma dostępu do zasobu, przekieruj go na stronę informacyjną.

Ta strona wyjaśnia przyczyny przekierowania, i daje im opcje, takie jak:

1. Click here to login as another user. 
2. Click here to request access to the page. 
3. Click here to login again, if your session has expired. 

byłoby to usunięcie odwołanie cykliczne, a tym samym problemem.

+0

Niestety aplikacja jest już w produkcji i nie mogę zmienić procedury logowania, naprawdę potrzebuję, aby była przezroczysta. – Element

+1

Myślę, że być może trzeba będzie wprowadzić bardziej zasadniczą zmianę w aplikacji. Czy nie można wydać nowej wersji z usuniętym problemem (np. Za pomocą rozwiązania httphandler)? – Charlie

1

Kilka opcji ...

One, przekierowanie ręcznie z powrotem do Login.aspx gdy użytkownik jest wylogowany, więc nie ma ReturnURL. Mieć metaodświeżanie na stronach, które pasuje do limitu czasu sesji, aby użytkownik nie kliknął zasobów, do których nagle nie może się dostać.

Po drugie, zawsze loguj kogoś w Page_Load z Login.aspx. Hej, czemu nie? Mogę wymyślić jakieś powody, ale może nie odnoszą się one do twojej sytuacji.

Trzy, zignoruj ​​ReturnURL. Nie musisz wywoływać strony RedirectFromLoginPage! Przekieruj użytkownika na domyślną stronę docelową podczas logowania.

1

Mieliśmy podobny problem, i naprawiłem to w następujący sposób:

If "LogOut".Equals(e.CommandName) Then 
    FormsAuthentication.SignOut() 
    Response.Redirect("~/Login.aspx") 
End If 

a następnie w Login.aspx zmieniamy PostBackUrl do Login.aspx jeśli zawiera parametr ReturnURL który wysyła użytkownikowi powrót do Login.aspx.

+0

Cześć Leandro, jest to dobra sugestia, z wyjątkiem tego, że działa tylko wtedy, gdy użytkownik kliknie przycisk Wyloguj, jeśli limit czasu sesji użytkowników nadal będzie przekazywał bieżący adres URL jako parametr powrotu. – Element

+0

Następnie ponownie usuń parametr ReturnUrl w adresie Postback w adresie Login.aspx, jeśli ReturnUrl zawiera Login.aspx. –

0

Co o dodanie modułu HTTP, który sprawdza, czy Request.UrlReferrer jest strona logowania, a jeśli tak sprawdza, czy są one upoważnione do dostępu do Request.Url i jeśli nie przekierowuje ich do "Nie masz uprawnień do przeglądania tej strony". strona.

0

Mimo że nie można zmienić nazwy pliku login.aspx na procedurę obsługi HTTP, czy próbowałeś dodać przekierowanie HTTP 301, aby za każdym razem, gdy zażądano pliku login.aspx, serwer przekierowywał użytkownika do procedury obsługi HTTP, np. login.ashx?

Powiązane problemy