2011-01-29 20 views
20

Potrzebuję, aby moi użytkownicy zostali przekierowani na stronę AuthError.aspx ("Nie masz dostępu do tej strony") w przypadku, gdy są uwierzytelnieni, ale spróbuj uzyskać dostęp do strony, do której nie mogą uzyskać dostępu (z powodu roli egzamin). Gdybym tak skonfigurować web.config:Jak przekierować użytkowników na stronę ASP.NET, gdy nie są autoryzowani?

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> 
</authentication> 

to jest złe zachowanie systemu, ponieważ użytkownik jest już uwierzytelniony i nie ma potrzeby, aby przekierować go do tej strony. Ale jeśli napiszę tutaj AuthError.aspx zamiast Login.aspx w jaki sposób mogę przekierować jeszcze nie uwierzytelnionego użytkownika na stronę logowania?

+2

Czuję twój ból na tym. Myślałem, że będzie łatwiej, ale nie znalazłem na to rozwiązania. Nie chcę uwierzytelnionych, ale nieautoryzowanych użytkowników widzących stronę logowania, gdy są już zalogowani. –

+0

Sprawdź ten wpis. http://stackoverflow.com/questions/14731707/redirect-user-to-another-page-from-web-config-when-his-role-has-not-enough-permi?rq=1 – Nishant

Odpowiedz

1

Musisz:

1) umożliwienia role (w pliku web.config): (wymienić 'XXX' z własnymi wartościami)

<roleManager enabled="true"> 
    <providers> 
    <clear /> 
    <add connectionStringName="ApplicationServices" applicationName="xxx" 
     name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" /> 
    <add applicationName="xxx" name="AspNetWindowsTokenRoleProvider" 
     type="System.Web.Security.WindowsTokenRoleProvider" /> 
    </providers> 
</roleManager> 

2) trzeba ograniczyć dostęp do niektórych obszarów witryny dla określonych ról. Właściwie odpowiedziałem dziś na inne pytanie, w którym wyjaśniam, jak to osiągnąć. Here odnośnikiem

+0

Dzięki, ale wszystkie te rzeczy już są zrobione. Być może opisałem błąd, ale problem polega na tym, że używam ról i lokalnych plików konfiguracyjnych do ochrony folderów, ale nie wiem, jak przekierować użytkownika, który próbuje uzyskać dostęp do folderu niedostępnego na prawidłową stronę AuthError.aspx. – mimic

-1

Można ustawić niestandardowej strony błędu tak:

<system.web> 
    <customErrors mode="On">   
    <error statusCode="403" redirect="AuthError.aspx" />  
    </customErrors> 
</system.web> 
+1

Niestety to nie działa. Jeśli go użyję, to ponownie otwiera stronę logowania zamiast przekierowywania do AuthError.aspx = ( – mimic

1

Trzeba odróżnić uwierzytelniania i autoryzacji. Twój fragment kodu odnosi się do poprzedniego ("Jestem mi znany na tej stronie"), ale nie do tego drugiego ("Mam dostęp do tej strony").

Jak sugeruje @santiagoIT, role mogą być najlepszym rozwiązaniem do wdrożenia autoryzacji, której potrzebujesz. Niektóre elementy sterujące, takie jak LoginView, są zależne od roli i uwierzytelniania, więc można ich używać do wyświetlania różnych treści w zależności od roli użytkownika.

Powszechnym podejściem jest wyświetlanie różnych menu użytkownikom w różne role, tak, że są one wyświetlane tylko z menu, które są odpowiednie do ich ról - LoginView jest często używany do tego.

Można również kontrolować widoczność treści na poszczególnych stronach, ponownie za pomocą LoginView, tak aby użytkownicy, którzy nie są uwierzytelnieni, otrzymywali wiadomości, którzy zostali uwierzytelnieni, ale nie mogli wyświetlać strony drugiej wiadomości oraz tych, którzy są uwierzytelnione i mogą przeglądać stronę, zobaczyć zawartość.

Jeśli chcesz po prostu przekierować użytkownika, który jest uwierzytelniony, ale nie ma wymaganego dostępu do przeglądania strony, możesz również sprawdzić, czy użytkownik jest odpowiednią rolą (Roles.IsUserInRole) i przekierować do "Ty". nie ma dostępu ... ", jeśli nie.

Osoby, które są naprawdę świadome kwestii związanych z bezpieczeństwem, mogą połączyć podejście ograniczone menu/widok z sprawdzaniem uprawnień na każdej stronie.

+0

Dziękuję za odpowiedź, ale wolę nie kodować tego zachowania, ale zaimplementować je za pomocą web.config. Oczywiście, mogę sprawdzić dostępność w tyle kod, ale chciałbym to zrobić, używając tylko web.config. – mimic

23

Na Page_Load swojej stronie logowania, będziemy chcieli, aby sprawdzić, czy użytkownik jest uwierzytelniony, a jeśli są one przekierować je na swojej stronie: odmowa dostępu

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (User.Identity.IsAuthenticated) // if the user is already logged in 
    { 
      Response.Redirect("~/AccessDenied.aspx"); 
    } 
} 

Jeśli chcesz uzyskać mało hodowcy, możesz sprawdzić parametr ReturnUrl, aby określić, czy użytkownik wszedł bezpośrednio na stronę (na przykład poprzez zakładkę zapisaną na stronie logowania) i poradzi sobie z tym inaczej.Oto przykład:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 

      // if they came to the page directly, ReturnUrl will be null. 
      if (String.IsNullOrEmpty(Request["ReturnUrl"])) 
      { 
       /* in that case, instead of redirecting, I hide the login 
        controls and instead display a message saying that are 
        already logged in. */ 
      } 
      else 
      { 
      Response.Redirect("~/AccessDenied.aspx"); 
      } 
     } 
    } 
+3

+1 Coz to rozwiązanie zadziała, ale czy to jest najlepsze rozwiązanie? – Ananth

+0

Doskonały - działał idealnie Dziękuję –

+0

To najlepszy, jaki do tej pory znalazłem –

0

spróbuj tego:

przypuszczać, trzeba tylko użytkowników administratora, aby uzyskać dostęp do podanej strony twoje następnie w page_load można napisać tak:

if (User.Identity.IsAuthenticated) 
{ 
    if (!User.IsInRole("Admin")) 
    { 
     Server.Transfer("~/AccessDeniedPage.aspx"); 
    } 

} 

aw przypadku Używasz tras, które możesz zrobić:

if (User.Identity.IsAuthenticated) 
{ 
    if (!User.IsInRole("Admin")) 
    { 
     Response.RedirectToRoute("AccessDeniedRoute"); 
    } 

} 
1

Dla mnie najmniej kłopotów, większość korzyści solutio Aby rozwiązać ten problem, należy utworzyć kolejną sekcję (panel) na stronie Login.aspx z treścią wyświetlaną użytkownikom uwierzytelnionym (np. zalogowany), mówiąc "Odmowa dostępu" zamiast formularza logowania. Kiedy zalogowany użytkownik trafi na stronę, oznacza to, że najprawdopodobniej trafił tutaj, ponieważ nie są uwierzytelnieni, aby uzyskać dostęp do strony, która przekierowała ich tutaj.

Na stronie logowania Używam tego bardzo prostego kodu, aby przełączyć widoczność formularza i panelu logowania:

if (Request.IsAuthenticated) 
{ 
    LoginUser.Visible = false; 
    AccessDeniedPanel.Visible = true; 
} 

To martwy prosty i działa.

Powiązane problemy