Как работает перенаправление на returnUrl в Asp.Net MVC5
Мы запустили новый сайт MVC 5, используя новую идентификацию Asp.Net с Owin. В моем "учетная запись" контроллер, имеющий атрибут [Authorize], у меня довольно стандартные действия;
// GET: /User/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
// POST: /User/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task Login(LoginViewModel model, string returnUrl)
{
try
{
if (ModelState.IsValid)
{
var userApi = new UserService();
var apiUser = await userApi.LogIn(UserManager, model.CardNumber, model.Pin, model.RememberMe);
if (apiUser != null)
{
await SignInAsync(apiUser, model.RememberMe);
if (string.IsNullOrEmpty(returnUrl))
{
return RedirectToAction("UserLoggedIn", "User");
}
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
}
catch (Exception ex)
{
Trace.TraceError("Cannot login {0}", ex.ToString());
Response.AppendToLog(ex.ToString());
ModelState.AddModelError("", ex.ToString());
}
// If we got this far, something failed, redisplay form
return View(model);
}
Мой вопрос касается поведения returnUrl, приведенный выше код работает в том смысле, что, если пользователь не вошел в систему и не вызывает действие в контроллере с атрибутом [Authorize], он отправляется вышеупомянутым действиям входа в систему и затем возвращается к контроллеру / действие, которое было запрошено. Что здорово, НО как ?? И это безопасно?
В этой статье о "Предотвращение атак открытого перенаправления "(для более ранних версий Asp.Net MVC) рекомендуется проверить returnUrl, что он 'Это локальный URL перед выполнением перенаправления, это то, что я должен сделать, или это теперь обрабатывается фреймворком?
Ура, Ола