programing tip

ASP.NET MVC 로그인 ReturnUrl이 항상 NULL입니까?

itbloger 2020. 12. 27. 10:26
반응형

ASP.NET MVC 로그인 ReturnUrl이 항상 NULL입니까?


사이트에 다시 로그인하려고 할 때 ASP.NET MVC에서 폼 인증을 사용하여 쿼리 문자열에 ReturnUrl 매개 변수를 넣습니다. 내 로그온 작업 메서드는 "returnUrl"문자열을 받아들입니다. 그러나 returnUrl 문자열은 쿼리 문자열에 명확하게 포함되어 있어도 항상 null 인 것 같습니다. 왜 이것이 사실이거나 가능한 수정 일 수 있는지에 대한 생각이 있습니까?


ReturnURL로그인 양식의 작업 속성에 매개 변수를 포함하지 않아 해당 매개 변수없이 URL에 게시 할 수 있습니까?


이것은 하나의 일반 로그온 양식을 사용하고 있지만 Controller 및 ActionMethod를 명시 적으로 지정하는 경우 발생하는 경향이 있습니다 (양식 게시를 유발하지만 쿼리 문자열이 손실 됨).

명확히하기 위해 BeginForm에서 코드는 다음과 같아야합니다.

Html.BeginForm("LogOn", "Account", new { ReturnUrl = Request.QueryString["ReturnUrl"] })

편집 : 이것은 RickAnd가 아래 주석에서 언급했듯이 의도적으로 설계된 것입니다. 그러나 익명 사용자를 허용하는 경우 사이트 깊숙한 곳에서 로그온을 클릭 한 다음 이전에 있던 페이지로 돌아가는 UI 패턴을 허용하지 않습니다. 일반적으로 요청되는 패턴입니다. LogOff에 대한 David Allen의 접근 방식은 LogOn의 깨끗한 리디렉션에도 잘 작동합니다.


기본적으로 Asp.net MVC에는 몇 가지 숨겨진 기능이 있습니다. 예를 들어 변수 'id'를 컨트롤러 액션에 전달하면 'id'를 기본 식별자로 해석하고 포 슬래시를 사용하여 브라우저 쿼리에 넣습니다 .'id '대신 다른 이름을 사용하면'? '가 표시됩니다. 포 슬래시보다는. global.asax 파일의 RegisterRoutes메소드에 'id'이름을 설정하기 때문입니다 .

이 문제에서는 다음 코드를 사용하여 컨트롤러에 대한 사용자 지정 데이터 전달자를 만들었습니다.

using(Html.BeginForm("LogOn", "Account", FormMethod.Post))
{
//form fields
}

따라서 Asp.net MVC는 컨트롤러 작업에 전달할 다른 유용한 데이터를 무시하고 returnUrl항상 null.

이것을 사용하면 Asp.net MVC가 올바르게 작동하고 returnUrl마운트됩니다.

using(Html.BeginForm())
{
//form fields in LogOn View
}

그건 그렇고, 우리가 사용자 지정 데이터 전달자를 사용하여 작업을 제어 할 때 다음 과 같이 다른 데이터를 수동으로 전달해야합니다 .

using(Html.BeginForm("LogOn", "Account", new {ReturnUrl = Request.QueryString["ReturnUrl"] }))
{
//form fields
}

로그온 및 로그 오프 시나리오를 처리하기 위해 생각할 수있는 두 가지 방법이 있습니다. Dave Beer는 위에서 한 가지 방법을 설명했습니다. 많은 상황에서 작동하는 또 다른 접근 방식이 있습니다. NerdDinner 튜토리얼을 코딩 할 때 사용했습니다. 이 튜토리얼은 로그 오프하고 집으로 데려가는 로그 오프 기능을 제공합니다. 나는 그것을 원하지 않았다. 로그 오프하기 전에 있던 페이지로 돌아가고 싶었습니다. 그래서 계정 컨트롤러 로그 오프 작업을 다음과 같이 수정했습니다.

   public ActionResult LogOff()
    {
        FormsService.SignOut();
        return Redirect(Request.UrlReferrer.ToString());
    }

이 동작을 재정의하려는 경우 더 멋지게 만들고 returnUrl을 전달하고 테스트 할 수 있습니다. 하지만 그게 필요하지 않습니다. 이것은 원하는 결과를 얻습니다. 로그온도 비슷하게 작동 할 수 있습니다. MVC 프레임 워크를 사용하여이 작업을 수행 할 수있는 방법이있을 수 있지만,이를 배우기 전까지는 매우 간단하고 안정적으로 작동합니다.


다음을 시도하십시오.

        public static MvcForm BeginForm(this HtmlHelper htmlHelper, string id)
    {
        string formAction = htmlHelper.ViewContext.HttpContext.Request.RawUrl;

        TagBuilder tagBuilder = new TagBuilder("form");

        tagBuilder.MergeAttribute("id", id);
        tagBuilder.MergeAttribute("action", formAction);
        tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(FormMethod.Post), true);

        HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response;
        httpResponse.Write(tagBuilder.ToString(TagRenderMode.StartTag));

        return new MvcForm(htmlHelper.ViewContext.HttpContext.Response);
    }

First ensure you have set the login url in the web.config, Next, ensure your Signin Form does not contain anything like action, for example:

View:

If you specify action you will always get null for return url:

Controller:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SignIn(string userName, string password, bool? rememberMe, string returnUrl)
{
}

ReferenceURL : https://stackoverflow.com/questions/827905/asp-net-mvc-login-returnurl-always-null

반응형