У меня есть проект ASP.Net Core MVC, над которым я работаю, и я просто хотел бы, чтобы мой пользователь вошел в систему и после входа был переведен на страницу userhome.
Я создал модель, контроллер и вид. В представлении я не уверен, как передать полноценного пользователя в мой контроллер, потому что в моем методе есть пользователь [Bind]. Чтобы передать отдельное свойство, я бы использовал Model.Id, я полагаю, мне нужна модель для полного объекта?
Я совершенно новичок в ASP.Net MVC. Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.
// UserDataAccess login method with username or email, not sure if this is the correct way
public string ValidateLogin(User user)
{
using(SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("spUserLogin", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@LoginID", user.Username);
cmd.Parameters.AddWithValue("@LoginEmail", user.Email);
cmd.Parameters.AddWithValue("@LoginPassword", user.Password);
conn.Open();
string result = cmd.ExecuteScalar().ToString();
conn.Close();
return result;
}
// LoginController
[HttpGet]
public IActionResult UserLogin()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UserLogin([Bind] User user)
{
//ModelState.Remove("Name");// ??
if(ModelState.IsValid)
{
string loginStatus = objUser.ValidateLogin(user);
if(loginStatus == "Success")
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.PrimarySid, user.Id.ToString(), ClaimValueTypes.Integer),
new Claim(ClaimTypes.Name, user.Username, ClaimValueTypes.String),
new Claim(ClaimTypes.Email, user.Email, ClaimValueTypes.String),
new Claim(ClaimTypes.GivenName, user.Name, ClaimValueTypes.String)
};
//ClaimsIdentity userIdentity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
ClaimsIdentity userIdentity = new ClaimsIdentity(claims, "login");
ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);
await HttpContext.SignInAsync(principal);
return RedirectToAction("UserHome", "User");
}
else
{
TempData["UserLoginFailed"] = "Login Failed. Plz enter correct data!";
return View();
}
}
else
{
return View();
}
}
[Authorize]
public IActionResult UserHome()
{
return View();
}
[HttpGet]
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync();
return RedirectToAction("Login", "UserLogin");
}
// Login View
@model MVC_Login.Models.User
@*<form asp-action="UserLogin">*@
<form method="post" action="@Url.Action("UserLogin", "Login", new { Model })">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Username" class="control-label"></label>
<input asp-for="Username" class="form-control" />
<span asp-validation-for="Username" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Password" class="control-label"></label>
<input asp-for="Password" class="form-control" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Login" class="btn btn-primary" />
@*<a asp-action="Create" class="btn btn">Sign Up</a>*@
</div>
</form>