왜 중복 returnUrl은 asp.net 웹 애플리케이션의 로직을 owin/identity로 리디렉션합니까?



asp.net-mvc asp.net-identity (1)

Visual Studio에서 새 웹 응용 프로그램 (webforms 또는 mvc)을 만들면 쿼리 문자열에 ReturnUrl 매개 변수를 확인한 후 사용자가있는 경우 사용자를 리디렉션하는 사후 인증 논리가 있습니다. weforms - Login.aspx .cs 당신은 이것을 가지고 있습니다 :

protected void LogIn(object sender, EventArgs e)
{
   ...
        switch (result)
        {
            case SignInStatus.Success:
                IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
                break;
            ...
        }
    }
}

MVC - AccountController.cs에는 다음이 있습니다.

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
   ...
    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl);
        ...
    }
}

이제 Owin 구성은 Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler 클래스를 사용하는 쿠키 인증을 사용하도록 설정되었습니다.이 클래스는 자체적으로 ReturnUrl 매개 변수를 확인하고 리디렉션이있는 경우이를 적용합니다.

protected override async Task ApplyResponseGrantAsync()
{
    AuthenticationResponseGrant signin = Helper.LookupSignIn(Options.AuthenticationType);
    bool shouldSignin = signin != null;
    AuthenticationResponseRevoke signout = Helper.LookupSignOut(Options.AuthenticationType, Options.AuthenticationMode);
    bool shouldSignout = signout != null;

    if (shouldSignin || shouldSignout || _shouldRenew)
    {
        ...

        if ((shouldLoginRedirect || shouldLogoutRedirect) && Response.StatusCode == 200)
        {
            IReadableStringCollection query = Request.Query;
            string redirectUri = query.Get(Options.ReturnUrlParameter);
            if (!string.IsNullOrWhiteSpace(redirectUri)
                && IsHostRelative(redirectUri))
            {
                var redirectContext = new CookieApplyRedirectContext(Context, Options, redirectUri);
                Options.Provider.ApplyRedirect(redirectContext);
            }
        }
    }
}

두 리디렉션은 로그인 / 인증 요청 중에 실행되는 것처럼 보입니다. 하나는 HttpContext.Response에 적용되고 다른 하나는 Owin 리디렉션 컨텍스트에 적용됩니다. 필자의 경험에 따르면 후자의 리다이렉션 호출이 성공한 것처럼 보입니다. 이것은 내장 된 Owin 리디렉션에 의해 무시되기 때문에 웹 사이트 코드에 로그인 후 특별 리디렉션 로직이있는 경우 문제가됩니다.

이 중복 논리에 대한 충분한 이유가 있습니까? 이건 그냥 가난한 디자인인가요? 그래서 asp.net Owin CookieAuthentication을 사용하고 있다면 계정 컨트롤러 또는 aspx 코드에 포스트 로그인 리디렉션 코드 로직이 있어야합니까? 그렇다면 리디렉션을 HttpContext.Response 또는 Owin을 통해 어떻게 든 적용해야합니까?


앞에서 말한 것처럼 리디렉션하는 세 가지 방법은 WebForms, MVC, OWIN 등 다른 부분에 속합니다. 그들 각각은 다른 것에서 독립적으로 사용할 수 있습니다 (자체 호스팅 상황에서 OWIN), 그래서 그들 각각 모두에서 똑같은 일을 할 필요가 있습니다.

그러나 최신 MVC 템플릿에 RedirectToLocal 필요한 이유를 완전히 모르겠습니다. 나도 이전 버전과의 호환성을 유지할 것입니다.

또한 OWIN 리디렉션 MVC에서 승리하지 않습니다 - 내 애플 리케이션 중 하나에서, 나는 항상 자신의 역할에 따라 사용자를 리디렉션, 로컬 URL이있는 매개 변수가 있더라도, 내 사용자는 항상 MVC 컨트롤러에 지정된 페이지에 끝납니다 .
그러나 OWIN 소스 코드와 리디렉션 논리를 살펴 보았을 때 MVC가 이깁니다. MVC 시나리오에서 어떤 일이 일어나는지 살펴볼 필요가 있습니다.





owin