Администратор Войти Пользовательский контроллер - PullRequest
0 голосов
/ 14 июля 2011

Я пытаюсь реализовать простой логин для администратора в проекте MVC3. Я новичок в ASP.NET и MVC3. Я гуглил и задавал вопросов ! Я видел много действительно хороших способов реализации этого, но все они были на очень абстрактном уровне и, откровенно говоря, может быть, в данный момент для меня это слишком много. У меня есть учетные данные в моей базе данных, так что в основном я просто хочу запросить это и перенаправить пользователя, если логин совпадает с ними, и если не отображать форму входа снова. Так вот что я получил. Моя модель:

  public class FormModel
{
    public bool isAdmin { get; set; }


 [Required(ErrorMessage = "Please enter your Username")]
 //[Remote("ValidateUserName", "Login", ErrorMessage = "UserName already taken!")]
 [StringLength(6, MinimumLength = 3)]
 [Display(Name = "Username:")]
 [RegularExpression(@"(\S)+", ErrorMessage = "White space is not allowed")] 
 public string UserName { get; set; }

 [Required(ErrorMessage = "Please enter your Password")]
 [DataType(DataType.Password)]
 [Display(Name = "Password:")]
 public string Password { get; set; }

}
 public User IsAdmin(string username, string password) 
   { 
      return (from user in db.Users 
      where user.username == username && user.password == password <--- alternative here is to just match username and pass against the data I have in my db columns(testdata 'admin', 'password')
      && user.IsAdmin == true  
      select user).SingleOrDefault(); 
    }

И в моем контроллере в основном это прямо сейчас:

   public ActionResult Index()
    {
        //some code here maybe a conditional
        return View();
    }

И наконец мой взгляд:

     @model Web.VoucherCannon.Models.FormModel
     @using (Html.BeginForm("HandleForm", "Login", FormMethod.Post, new {id = "myForm"})) {
@Html.ValidationSummary(true)
        <div class="editor-label">
        @Html.LabelFor(model => model.UserName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.UserName)
        @Html.ValidationMessageFor(model => model.UserName)
    </div> 
    <div class="editor-label">
        @Html.LabelFor(model => model.Password)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Password)
        @Html.ValidationMessageFor(model => model.Password)
    </div>
    <button class="button">Log In</button> 
      }

Так что теперь. Как я могу использовать возвращенный результат запроса в моем контроллере, чтобы я мог войти? Я уверен, что я сделаю рефакторинг позже и сделаю это со слоем dbcontext и так далее, но сейчас я буду счастлив сделать эту работу. Благодарен за помощь!

1 Ответ

0 голосов
/ 14 июля 2011

У вас должно быть 2 действия контроллера: одно для рендеринга формы входа в систему (доступной в GET) и одно для обработки отправки (доступной в POST) и выполнения фактической аутентификации.

// This will render the Login view (the one you have shown)
public ActionResult Login()
{
    var model = new FormModel();
    return View(model);
}

// This one is responsible for handling the submission and credential verification
[HttpPost]
public ActionResult Login(FormModel model)
{
    if (!ModelState.IsValid)
    {
        // The user submit the form but validation 
        // (as defined on the model using DataAnnotation attributes) failed
        // => redisplay the view so that the user can fix his errors
        return View(model);
    }

    // notice that you don't need to pass parameters to the IsAdmin method
    // as it already contains the username and password as properties
    if (!model.IsAdmin()) 
    {
        // The IsAdmin method didn't verify the credentials => add a model error
        // and redisplay the login view
        ModelState.AddModelError("username", "dude you are not an admin");
        return View(model);
    }

    // OK, at this stage everything is fine => we can grant access
    // by issuing an authentication cookie
    FormsAuthentication.SetAuthCookie(model.UserName, false);

    // finally we redirect to some home page for admins
    return RedirectToAction("Index", "Admin");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...