ASP.Net Core MVC Логин пользователя - PullRequest
0 голосов
/ 18 марта 2019

У меня есть проект 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>

1 Ответ

0 голосов
/ 18 марта 2019

Вы не можете отправить объектную модель в представление, используя return RedirectToAction("UserHome", "User"). Также вы можете отправить объект (в вашем случае с данными пользователя) в «Вид» из контроллера.;

Сначала получите информацию о пользователе, а затем используйте:

var userDataModel = foo; // Get user information
return View("ActionName", "ControllerName", userDataModel); // send to view

Примечание : объект userDataModel должен быть равен модели в представлении.

Надеюсь, это может пригодиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...