Я пытаюсь реализовать простой Asp. net основной поток входа в веб-приложение.
Модель входа в систему
namespace Trading_System.UI.Pages.Account
{
public class LoginModel : PageModel
{
[BindProperty]
public string Username { get; set; }
[BindProperty]
public string Password { get; set; }
public string ReturnUrl { get; set; }
public string ErrorMessage { get; set; }
private IUserManager m_userManager;
public LoginModel(IUserManager userManager)
{
m_userManager = userManager;
}
public void OnGet(string returnUrl)
{
ReturnUrl = returnUrl;
}
public async Task<IActionResult> OnPost()
{
var user = m_userManager.GetUser(Username, Password);
if (user == null)
{
ErrorMessage = "Username or password are invalid.";
return Page();
}
var claims = new List<Claim>()
{
new Claim(ClaimTypes.NameIdentifier, user.UserName)
};
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
return new RedirectToRouteResult(ReturnUrl);
}
public async Task<IActionResult> OnPostLogout(string returnUrl)
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return new RedirectToPageResult("/index");
}
}
}
Код html для входа в систему
@page
@model Account.LoginModel
@{
ViewData["Title"] = "Login";
}
<div class="login-page">
<div class="page-header">
<h1>Login</h1>
</div>
<div class="row">
<div class="col-sm-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Please enter your credentials</h3>
</div>
<div class="panel-body">
<form method="post">
<fieldset>
<div class="form-group">
<label asp-for="Username"></label>
<input class="form-control" placeholder="Username" asp-for="Username" autofocus>
</div>
<div class="form-group">
<label asp-for="Password"></label>
<input type="password" class="form-control" placeholder="Password" asp-for="Password" autocomplete="off">
</div>
<div class="form-group">
<button class="btn btn-primary">Login</button>
</div>
@if(!string.IsNullOrEmpty(Model.ErrorMessage))
{
<div class="alert alert-warning">@Model.ErrorMessage</div>
}
</fieldset>
</form>
</div>
</div>
</div>
</div>
</div>
Я устанавливаю свойство ReturnUrl при вызове OnGet (например, "https://localhost: 44389 / Account / Login? ReturnUrl =% 2FSecretPage ") Но я также пытался установить его вручную, чтобы проблемы не было.
После того, как я нажал «Войти», меня перенаправили на страницу входа в систему независимо от того, что задано ReturnUrl (я вижу в chrome ответ 302). URL после отправки: "https://localhost: 44389 / Аккаунт / Логин? Длина = 14 "
Что я делаю не так? Я просто хочу перенаправить обратно на маршрут, по которому я был до перенаправления на страницу входа.