2011-08-07 44 views
8

ReturnUrl là loại xấu xí. Thay vào đó, tôi muốn sử dụng redirect. Làm cách nào tôi có thể chỉ định tên của thông số sẽ được sử dụng cho URL chuyển hướng xác thực biểu mẫu cùng với thuộc tính [Authorize]? Hay tôi phải tạo một triển khai IAuthorizationFilter? :(Làm cách nào để thay đổi tên của tham số "ReturnUrl" được ASP.NET MVC sử dụng?

Ví dụ:

[Authorize] 
public class Tools : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Khi người dùng không được đăng nhập lần http://example.com/tools, tôi muốn họ được chuyển hướng tới http://example.com/account/logon?redirect=%2ftools, thay vì mặc định http://example.com/Account/LogOn?ReturnUrl=%2ftools

Đối với/tài khoản/phần đăng nhập, tôi có thể sửa đổi các tuyến đường của mình trong Global.asax và thay đổi

<authentication mode="Forms"> 
    <forms loginUrl="~/account/logon" timeout="2880" /> 
</authentication> 

trong web.config Nhưng tôi không biết cách thay đổi Ret tham số urnUrl.

+0

Tôi biết tôi rất muộn để thảo luận này nhưng tôi có cùng một vấn đề vì vậy tôi đã đăng một yêu cầu nâng cao cho điều này với Microsoft. http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3049874-make-returnurl-a-configurable-key-name-instead-o Hãy bình chọn cho nó, bình luận về nó, v.v. Với đủ số phiếu, nó có thể thu hút sự chú ý của họ. –

Trả lời

1

Không phải là giải pháp tốt nhất, nhưng nó hoạt động ...

<rule name="FormsAuthentication" stopProcessing="true"> 
    <match url="^account/log(i|o)n$" /> 
    <conditions> 
    <add input="{QUERY_STRING}" pattern="^ReturnUrl=([^=&amp;]+)$" /> 
    </conditions> 
    <action type="Redirect" url="account/logon?redirect={C:1}" appendQueryString="false" /> 
</rule> 
0

Vấn đề ở đây là chuyển hướng không phải là bài đăng. Đó là một nhận được. Cách duy nhất để vượt qua biến trên get là sử dụng tham số chuỗi truy vấn của một số loại. Bạn có thể ngụy trang lại url này nhưng nó vẫn là một tham số truy vấn và được truyền vào URL.

Có lẽ bạn có thể hiểu rõ hơn về những gì bạn đang tìm kiếm?

+0

Tôi không chắc bạn hiểu câu hỏi của tôi ... Tôi đã thêm một ví dụ, hy vọng rằng sẽ làm cho những gì tôi yêu cầu rõ ràng hơn. –

+0

Vâng, tôi hiểu ý của bạn bây giờ .. Điều này dường như xảy ra hơn nữa trong chuỗi. Khi 401 được trả về, nó sẽ được giữ lại chuỗi và chuyển hướng được phát hành. Tôi đang nhìn vào nó. –

0

Không có cách nào để thay đổi tên của tham số sử dụng cấu hình vì tên thông số "ReturnUrl" được mã hóa cứng trong lớp System.Web.Security.FormsAuthentication, là lớp được sử dụng để xác thực biểu mẫu, bao gồm cả chuyển hướng.

Một cách để đạt được kết quả mong muốn là mở rộng thuộc tính Ủy quyền sao cho nó chuyển hướng đến trang đăng nhập với tên thông số tùy chỉnh của bạn. Sau đó, tùy thuộc vào phương thức bổ sung nào từ FormsAuthentication bạn sử dụng, bạn cũng có thể sửa đổi các phương thức đó, cụ thể là FormsAuthentication.RedirectFromLoginPage.

-1

Không thể thay đổi tên thông số, điều này gây phiền toái. Tôi đã giải quyết điều này bằng cách viết mô-đun xác thực của riêng mình - bạn cần biết cách xác thực hoạt động bên trong, nhưng nó không khó - chỉ cần xem cách nó được thực hiện trong phản xạ (và có thể đơn giản hóa nó, tôi đã kết thúc bằng cách sử dụng mã hóa/giải mã cookie từ FormsAuthentication).

+0

Thực ra bạn có thể thay đổi, xem http://msdn.microsoft.com/en-us/library/hh975440.aspx –

10

Thêm phím này để phần appSettings của web.config của bạn

<add key="aspnet:FormsAuthReturnUrlVar" value="redirect" /> 
-1

Chỉ cần thêm trong web.config của bạn trong phần appSettings theo cặp khóa-giá trị:

<add key="aspnet:FormsAuthReturnUrlVar" value="your-custom-parameter-name"/> 
2

Câu hỏi và câu trả lời ở đây có vẻ liên quan đến thứ e công cụ xác thực mẫu cũ. Trên các phiên bản mới hơn của MVC, ví dụ: MVC 5 (với nhận dạng 2.0), bạn sẽ làm một cái gì đó như thế này trong Startup.Auth.cs:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/account/login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       // Enables the application to validate the security stamp when the user logs in. 
       // This is a security feature which is used when you change a password or add an external login to your account. 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      }, 
      ReturnUrlParameter = "redirect" 
     }); 

Phần quan trọng là tất nhiên ReturnUrlParameter = "redirect" (có thể là bất cứ điều gì). Phần còn lại có thể khác với dự án của bạn.

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