2009-02-27 7 views
7

사용자가 인증이 필요한 내 사이트의 링크를 클릭하면 브라우저가 로그인 페이지로 리디렉션됩니다. 로그인 페이지에는 returnUrl querystring 매개 변수가 있습니다. 문제는 사용자가 OpenID를 사용하여 인증하면 공급자가 사용자를 로그인 페이지로 리디렉션하고 returnUrl 매개 변수를 포함하지 않는다는 것입니다. 사용자가 시도한 페이지 대신 홈 페이지로 리다이렉트하기 때문에 꽤 지루합니다 .OpenID의 ReturnUrl을 어떻게 바꿀 수 있습니까?

DotNetOpenID를 사용하고 있습니다. 문제를 해결할 수있는 방법이 있습니까?

답변

11

정말 쉽습니다. 브루노. 그냥 로그인 페이지에 returnUrl 인수를 유지하고 원하는 동작을 취득 DotNetOpenId을 말할 것이다

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

를 호출합니다. 결과를 처리하는 로그인 페이지와 로그인 페이지를 표시하는 URL을 분리하는 것에 대해서는 Franci와 동의하지 않으면 안됩니다. 일 수있는 ASP.NET MVC 사이트의 경우 사용자에게 오류를 표시하는 것 외에도 실제로 갈 길이 멀지 않은 ASP.NET 웹 양식의 경우에도 로그인 양식을 표시하고 싶으므로 다시. 게다가, 논리의 분리까지, DotNetOpenId 라이브러리는 당신에게 힘든 일을합니다. 따라서 코드 숨김 페이지에 로직이 거의 없습니다.

+1

AddCallbackArgument ** s ** –

+0

그래, 고마워. 내 대답을 바로 잡았어. –

+0

간단하지는 않습니다 : "콜백 인수는 IRelyingPartyAssociationStore가 OpenIdRelyingParty에 제공 될 때만 지원됩니다." – Perry

3

OpenID 공급자가 다른 URL로 돌아가려면 인증 요청을 만들 때 OpenIdRelyingParty.CreateRequest(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl) 메서드를 사용해야합니다.

그러나 일반적으로 OpenID 공급자가 앱에서 로그인 시퀀스를 시작한 URL로 리디렉션하지 않도록해야합니다. 응답을 제대로 처리하기 위해 OpenID 인증을 시작한 시점으로 돌아가고 싶습니다. 앱의 나머지 로직에서 OpenID 레이어를 캡슐화하는 데 도움이됩니다.

여기 예입니다 : 내 ASP.NET MVC 응용 프로그램에서

, 나는 로그인 요청을 처리 Authenticate 행동과 User 컨트롤러를 가지고있다.

Authenticate 조치 확인 OpenIdRelyingParty.Response. null 인 경우 작업은 RedirectToProvider을 호출합니다. 공급자는 동일한 작업으로 돌아가서 Respons.Status을 확인합니다. 그것이 AuthenticationStatus.Authenticated 인 경우 사용자가 로그인 순서를 시작한 페이지로 돌아가려면 FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, true)을 사용합니다.

그러나 상태가 AuthenticationStatus.Failed 또는 'AuthenticationStatus.Canceled'인 경우이 문제를 해결하기위한 단계를 사용자에게 제공 할 수 있습니다. 잘못 입력 한 경우 OpenID를 수정하거나 사용자 이름/비밀번호로 로그인하도록 제안 할 수 있습니다. (동일한 ID에 대한 OpenID와 사용자 이름/비밀번호 인증을 모두 지원합니다)

내 로그인 상자는 모든 페이지에 있습니다. OpenID 제공 업체가 로그인 요청을 시작한 페이지로 다시 리디렉션하면 해당 페이지가 오류를 제대로 처리하지 못할 가능성이 있습니다.

+0

나는 당신과 비슷하게 만들었지 만, 공급자가 사용자를 인증 액션으로 다시 리디렉션하면 returnUrl 매개 변수가 사라집니다 ... 그래서 RedirectFromLoginPage가 작동하지 않습니다 ... – Bruno

+0

은 Authenticate 메소드를 쿼리의 returnUrl - http : // localhost/user/authenticate? returnurl =/somepage & uid = http : //myopenid.com/francip. OpenID 공급자가 Authenticate 메서드로 반환하면 returnUrl이 쿼리에 다시 있어야합니다. –

관련 문제