Tôi đang tạo một trang web cho thuê nhiều nơi lưu trữ các trang cho khách hàng. Phân đoạn đầu tiên của URL sẽ là một chuỗi xác định máy khách, được xác định trong Global.asax bằng cách sử dụng lược đồ định tuyến URL sau:
"{client}/{controller}/{action}/{id}"
Điều này hoạt động tốt, với các URL như / foo / Home / Index.
Tuy nhiên, khi sử dụng thuộc tính [Authorize], tôi muốn chuyển hướng đến trang đăng nhập cũng sử dụng cùng một lược đồ ánh xạ. Vì vậy, nếu khách hàng là foo, trang đăng nhập sẽ là / foo / Tài khoản / Đăng nhập thay vì chuyển hướng cố định / Tài khoản / Đăng nhập được xác định trong web.config.
MVC sử dụng HttpUnauthorizedResult để trả về trạng thái 401 trái phép, mà tôi cho rằng khiến ASP.NET chuyển hướng đến trang được xác định trong web.config.
Vậy có ai biết cách ghi đè hành vi chuyển hướng đăng nhập ASP.NET không? Hoặc sẽ tốt hơn nếu chuyển hướng trong MVC bằng cách tạo thuộc tính ủy quyền tùy chỉnh?
CHỈNH SỬA - Trả lời: sau khi đào sâu vào nguồn .Net, tôi quyết định rằng thuộc tính xác thực tùy chỉnh là giải pháp tốt nhất:
public class ClientAuthorizeAttribute: AuthorizeAttribute
{
public override void OnAuthorization( AuthorizationContext filterContext )
{
base.OnAuthorization( filterContext );
if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult )
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "client", filterContext.RouteData.Values[ "client" ] },
{ "controller", "Account" },
{ "action", "Login" },
{ "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
});
}
}
}