Po utworzeniu nowej aplikacji internetowej (albo webforms lub mvc) w wizualnym studio, jest logika post-uwierzytelniania, która sprawdza parametr ReturnUrl w ciągu zapytania, a następnie przekierowuje użytkownika, jeśli istnieje: Weforms - Login.aspx.cs masz to:dlaczego powielona logika przekierowania returnUrl w aplikacjach internetowych asp.net z owin/identity?
protected void LogIn(object sender, EventArgs e)
{
...
switch (result)
{
case SignInStatus.Success:
IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
break;
...
}
}
}
w MVC - AccountController.cs masz to:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
...
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
...
}
}
teraz dodatkowo konfiguracja Owin jest skonfigurowany do korzystania z uwierzytelniania cookie, który używa Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler klasa, która sama w sobie che CKS dla parametru ReturnURL i dotyczy przekierowanie jeśli istnieje:
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);
}
}
}
}
Oba przekierowania wydają się wykonać podczas wniosek logowanie/uwierzytelniania. Jeden jest stosowany w HttpContext.Response, a drugi jest stosowany w kontekście przekierowania Owin. Z mojego doświadczenia wynika, że to ostatnie przekierowanie wygrywa, co jest problemem, jeśli masz specjalną logikę przekierowania zastosowaną po zalogowaniu w kodzie witryny, ponieważ zostanie ona przesłonięta przez wbudowane przekierowanie Owin.
Czy istnieje powód dla tej powielonej logiki? Czy to po prostu kiepski projekt? Więc jeśli używam asp.net Owin CookieAuthentication, czy powinienem mieć logikę przekierowania kodu po zalogowaniu na kontrolerze konta lub kod aspx? A jeśli tak, czy przekierowanie powinno być jakoś zastosowane w HttpContext.Response lub przez Owin?
'RedirectToLocal' jest metodą pomocniczą, która uruchamia wartość parametru' returnUrl' poprzez 'IsLocalUrl' w celu określenia, czy jest to ścieżka w stosunku do bieżącej strony. Zapobiega to przechwytywaniu parametru "returnUrl" w celu przekierowania do witryny innej firmy. –
@ChrisPratt Niemal taka sama logika ma miejsce w metodzie OWIN przytoczonej powyżej – trailmax