2009-02-12 7 views
7

Làm cách nào để bạn giải quyết vấn đề vòng lặp đăng nhập vô hạn khi bạn đang sử dụng các phiên không có cookieless và không thể thay đổi tên của login.aspx thành một người gửi khiếu nại?Vòng đăng nhập xác thực mẫu Asp.net

tức là khi người dùng có quyền quản trị truy cập nút đăng xuất và url trả về của trang bị hạn chế được chuyển đến login.aspx thì người dùng khác không có quyền quản trị để đăng nhập họ được chuyển hướng trở lại trang đăng nhập.

Tôi đã xem qua số solution nhưng tôi không thể thay đổi tên của login.aspx thành trình xử lý http và hàm isauthenticated dường như không hoạt động trong trang aspx với auth cookieless vì biểu mẫu auth ticket có vẻ là bị tước khỏi url khi được chuyển hướng trở lại trang đăng nhập.

EDIT:

Bởi vì ứng dụng này là đã có trong sản xuất, tôi không thể làm thay đổi dòng chảy của trang đăng nhập logout trình// timeout hoặc đổi tên trang đăng nhập.

+1

thats một câu hỏi damn tốt – StevenMcD

+0

Tôi đồng ý với những người khác trong một khía cạnh: Làm thế nào bạn có thể sửa lỗi này nếu bạn không thể sửa đổi bất cứ điều gì? Bạn đang tìm kiếm một giải pháp chỉ thay đổi tệp web.config và không có gì khác? Tôi thực sự không nghĩ rằng điều này là có thể – juan

Trả lời

2

Kiểm tra xem người dùng có được phép truy cập trang trong returnUrl hay không, sau khi đăng nhập trên trang login.aspx. Bạn có thể sử dụng phương pháp này của UrlAuthorizationModule (hoặc tùy chỉnh một nếu nó hoạt động tốt nhất cho bạn):

System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal(

    returnUrl, 
    userPrincipal, 
    GET"); 

Nếu người dùng là không được phép, chỉ cần chuyển hướng đến một trang mà người dùng có thể truy cập.

Để có được chủ yếu sử dụng:

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

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

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

    roles 

); 
+0

Hi Freddy, đây là một ý tưởng tốt, ngoại trừ tôi không nghĩ rằng bạn có thể truy cập một đối tượng genericprincipal xác thực cho đến khi vé biểu mẫu đã được chèn vào url. Có thể lấy đối tượng chính được xác thực trong trang đăng nhập một số cách không? – Element

+0

Tôi đã chỉnh sửa và thêm mã mẫu để lấy GenericIdentity. – eglasius

+0

Điều này hoạt động chắc chắn, nó hoạt động như thế nào? – eglasius

0

Bạn có thể thay đổi luồng trang không?

Ý của tôi là, thay vào đó chuyển hướng trở lại trang login.aspx khi người dùng không có quyền truy cập vào tài nguyên, chuyển hướng họ đến trang thông tin.

Trang này giải thích lý do cho sự chuyển hướng, và cung cấp cho họ các tùy chọn như:

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. 

Điều này sẽ loại bỏ các tham chiếu vòng tròn, và do đó vấn đề.

+0

Thật không may là ứng dụng đang được sản xuất và tôi không thể thay đổi thủ tục đăng nhập, tôi thực sự cần nó để được minh bạch. – Element

+1

Tôi nghĩ bạn có thể phải thực hiện thay đổi cơ bản hơn cho ứng dụng. Bạn không thể phát hành phiên bản mới của vấn đề này với sự cố đã được khắc phục (tức là bằng cách sử dụng giải pháp người bảo trợ)? – Charlie

1

Một vài tùy chọn ...

Một, chuyển hướng thủ công trở lại Login.aspx khi người dùng đăng xuất, do đó không có ReturnURL. Có một siêu làm mới trên các trang của bạn khớp với thời gian chờ của phiên để người dùng không nhấp vào tài nguyên mà họ đột nhiên không thể truy cập.

Hai, luôn đăng xuất ai đó trong Page_Load của Login.aspx. Hey, tại sao không? Tôi có thể nghĩ ra một số lý do, nhưng có thể họ không áp dụng cho tình huống của bạn.

Ba, bỏ qua ReturnURL. Bạn không cần phải gọi RedirectFromLoginPage! Chuyển hướng người dùng đến trang đích mặc định khi đăng nhập.

1

Chúng tôi đã có một vấn đề tương tự, và tôi cố định nó làm như sau:

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

Và sau đó trong Login.aspx chúng ta thay đổi PostBackURL đến Login.aspx nếu nó chứa một tham số ReturnUrl mà gửi cho người dùng trở lại vào Login.aspx.

+0

Xin chào Leandro, đây là một gợi ý tốt, ngoại trừ nó sẽ chỉ hoạt động khi người dùng nhấp vào nút Đăng xuất, nếu phiên người dùng hết thời gian, nó vẫn sẽ chuyển URL hiện tại làm thông số trả về. – Element

+0

Sau đó, một lần nữa, xóa tham số ReturnUrl trong URL đăng lại biểu mẫu của Login.aspx nếu ReturnUrl chứa Login.aspx. –

0

gì về việc thêm một module http để kiểm tra nếu Request.UrlReferrer là trang đăng nhập và nếu như vậy kiểm tra nếu họ được phép truy cập vào Request.Url và nếu không chuyển hướng chúng đến "Bạn không được phép xem trang này". trang.

0

Mặc dù bạn nói rằng bạn không thể thay đổi tên của login.aspx thành trình xử lý HTTP, bạn đã thử thêm chuyển hướng HTTP 301 để bất cứ khi nào login.aspx được yêu cầu máy chủ chuyển hướng người dùng đến trình xử lý HTTP, ví dụ: login.ashx?