2009-02-27 29 views
7

Khi người dùng nhấp vào liên kết trong trang web của tôi yêu cầu xác thực, trình duyệt sẽ được chuyển hướng đến trang đăng nhập. Trang đăng nhập bao gồm thông số chuỗi truy vấn returnUrl. Vấn đề là nếu người dùng xác thực bằng cách sử dụng OpenID, nhà cung cấp sẽ chuyển hướng người dùng trở lại trang đăng nhập và không bao gồm tham số returnUrl, điều này khá nhàm chán vì tôi chuyển hướng người dùng đến trang chủ thay vì trang đã được thử .Tôi làm cách nào để thay đổi ReturnUrl cho OpenID?

Tôi đang sử dụng DotNetOpenID, có cách nào để sửa lỗi này không?

Trả lời

11

Thật dễ dàng, Bruno. Chỉ cần gọi

IAuthenticationRequest.AddCallbackArguments("returnUrl", Request.QueryString["returnUrl"]); 

Điều đó sẽ cho DotNetOpenId để bảo vệ lập luận ReturnURL trên trang đăng nhập và nhận được hành vi mà bạn muốn. Tôi phải không đồng ý với Franci về việc tách URL hiển thị trang đăng nhập từ trang xử lý kết quả. Đối với các trang ASP.NET MVC có thể phù hợp, nhưng đối với các biểu mẫu web ASP.NET thực sự không phải là cách để đi, vì ngoài việc hiển thị bất kỳ lỗi nào cho người dùng, bạn sẽ không muốn hiển thị biểu mẫu đăng nhập lần nữa. Bên cạnh đó, khi tách logic, thư viện DotNetOpenId thực hiện tất cả các công việc nặng nhọc cho bạn, vì thế hầu như không có bất kỳ logic nào trong trang code-behind của bạn.

+1

Nếu đó là AddCallbackArgument ** s ** –

+0

Có, cảm ơn. Tôi đã sửa chữa câu trả lời của mình. –

+0

Không hoàn toàn đơn giản: "Đối số gọi lại chỉ được hỗ trợ khi một IRelyingPartyAssociationStore được cung cấp cho OpenIdRelyingParty." – Perry

3

Nếu bạn muốn nhà cung cấp OpenID quay lại một url khác, bạn cần sử dụng phương thức OpenIdRelyingParty.CreateRequest(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl) khi tạo yêu cầu xác thực.

Tuy nhiên, thường bạn không muốn nhà cung cấp OpenID chuyển hướng trở lại url đã bắt đầu trình tự đăng nhập trong ứng dụng của bạn. Bạn muốn quay trở lại điểm mà bạn đã bắt đầu xác thực OpenID để xử lý đúng phản hồi. Giúp với việc đóng gói lớp OpenID từ phần còn lại của logic trong ứng dụng của bạn.

Dưới đây là một ví dụ:

Trong ứng dụng ASP.NET MVC của tôi, tôi có một bộ điều khiển User với Authenticate hành động mà xử lý yêu cầu đăng nhập.

Kiểm tra hành động AuthenticateOpenIdRelyingParty.Response. Nếu đó là null, các cuộc gọi hành động RedirectToProvider. Nhà cung cấp trả lại cho cùng một hành động, nơi tôi kiểm tra số Respons.Status. Nếu đó là AuthenticationStatus.Authenticated, tôi sử dụng FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, true) để quay lại trang mà người dùng đã bắt đầu đăng nhập seqeuence từ đó.

Tuy nhiên, nếu trạng thái là AuthenticationStatus.Failed hoặc 'AuthenticationStatus.Canceled`, tôi có thể cung cấp các bước của người dùng để giải quyết vấn đề này. Tôi có thể cung cấp cho họ để sửa OpenID của họ nếu mistyped hoặc đăng nhập với tên người dùng/mật khẩu để thay thế. (Tôi hỗ trợ cả OpenID và xác thực tên người dùng/mật khẩu cho cùng một mã định danh)

Hộp đăng nhập của tôi nằm trên mọi trang. Nếu nhà cung cấp OpenID chuyển hướng tôi trở lại trang đã khởi tạo yêu cầu đăng nhập, rất có thể trang đó sẽ không có khả năng xử lý lỗi không chính xác.

+0

Tôi đã làm nó tương tự như của bạn, nhưng vấn đề là khi nhà cung cấp chuyển hướng người dùng trở lại hành động xác thực của tôi, tham số returnUrl đã biến mất ... do đó RedirectFromLoginPage không hoạt động ... – Bruno

+0

gọi phương thức Authenticate với returnUrl trong truy vấn - http: // localhost/user/authenticate? returnurl =/somepage & uid = http: //myopenid.com/francip. khi nhà cung cấp OpenID trả về phương thức Authenticate, returnUrl sẽ nằm trong truy vấn một lần nữa. –

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