2009-08-25 43 views
11

Tôi có một dự án ASP.NET MVC, và tôi muốn có một LoginUrl khác nhau cho các khu vực khác nhau của trang web. Tùy thuộc vào khu vực của trang web, các loại thông tin đăng nhập khác nhau được nhập.LoginUrl khác nhau cho URL khác nhau với ASP.NET MVC và các hình thức xác thực

http://host.com/widget/home sẽ chuyển hướng người dùng đến http://host.com/widget/logon.

http://host.com/admin/home sẽ chuyển hướng người dùng đến http://host.com/admin/logon.

Cho đến nay, giải pháp tốt nhất mà tôi đã đưa ra, là phải có hình thức Auth loginUrl = "~/tài khoản/Logon" trong web.config:

<authentication mode="Forms"> 
     <forms loginUrl="~/Account/LogOn" timeout="2880"/> 
    </authentication> 

Trong bộ điều khiển cho Tài khoản:

public ActionResult LogOn() 
{ 
    //redirect depending on the returnUrl? 
    string returnUrl = ControllerContext.Controller.ValueProvider["ReturnUrl"].AttemptedValue; 
    if (returnUrl.StartsWith("/widget")) 
    { 
     return Redirect(string.Format("/widget/Logon?ReturnUrl={0}", returnUrl)); 
    } 
    if (returnUrl.StartsWith("/admin")) 
    { 
     return Redirect(string.Format("/admin/Logon?ReturnUrl={0}", returnUrl)); 
    } 
    return View(); 
} 

Có cách nào tốt hơn để thực hiện việc này không?

+1

BTW: bạn chỉ có thể đặt returnUrl làm tham số chuỗi cho phương thức: LogOn (string returnUrl) –

Trả lời

1

Tôi biết rằng bạn có thể có tệp web.config riêng biệt trong các thư mục con của trang web, để nếu bạn có các trang .aspx thực trong thư mục/quản trị và web.config trong thư mục đó, bạn có thể chỉ định url xác thực trong thư mục đó một cách riêng biệt.

Tôi không chắc chắn nếu điều đó làm việc với các tuyến đường ASP.NET MVC như bạn có thể sẽ không có tập tin vật lý trong các thư mục con, nhưng nó có giá trị một thử.

+2

Trong MVC Areas bạn có web.config riêng biệt nhưng có thể bạn sẽ gặp lỗi nếu bạn cố thêm thuộc tính xác thực: Đó là lỗi khi sử dụng một phần được đăng ký như allowDefinition = 'MachineToApplication' vượt quá mức ứng dụng. Lỗi này có thể được gây ra bởi một thư mục ảo không được cấu hình như một ứng dụng trong IIS. – Jafin

1

Thêm thuộc tính Authenticate vào hành động của bạn.

Sau đó, trong global.asax, thêm Application_AuthenticateRequest rồi xem người gửi và chuyển hướng đến nơi bạn muốn hành động đăng nhập.

+0

Tôi chỉ tò mò, nhưng điều này có vẻ tương tự như những gì tôi đã làm ban đầu, chỉ ở một nơi khác. Ưu điểm của việc làm theo cách này là gì? – mlsteeves

Các vấn đề liên quan