2016-07-29 3 views
1

Использование ASP.Net, C#, MVC я получаюASP.Net MVC Invalid Войти попытка

недопустимая попытка входа в систему.

при попытке входа в систему. Я прокомментировал ссылку на электронную почту, так как я хочу использовать имя пользователя и пароль для входа. При отладке я проверяю, что значения верны, и я также проверил значения в таблице, чтобы убедиться, что нет никаких скрытых символов, которые делают UserName или Password более длинными и которые проверяются.

Вот мой код:

AccountViewModels.cs:

public class LoginViewModel 
    { 
     [Required] 
     [Display(Name = "UserName")] 
     public string UserName { get; set; } 

     //[Required] 
     //[Display(Name = "Email")] 
     //[EmailAddress] 
     //public string Email { get; set; } 

     [Required] 
     [DataType(DataType.Password)] 
     [Display(Name = "Password")] 
     public string Password { get; set; } 

     [Display(Name = "Remember me?")] 
     public bool RememberMe { get; set; } 
    } 

Login.cshtml:

<div class="row"> 
    <div class="col-md-8"> 
     <section id="loginForm"> 
      @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
      { 
       @Html.AntiForgeryToken() 
       <h4>Use a local account to log in.</h4> 
       <hr /> 
       @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
       @*<div class="form-group"> 
        @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" }) 
        <div class="col-md-10"> 
         @Html.TextBoxFor(m => m.Email, new { @class = "form-control" }) 
         @Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" }) 
        </div> 
       </div>*@ 
       <div class="form-group"> 
       @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" }) 
       <div class="col-md-10"> 
        @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" }) 
       </div> 
       </div> 
       <div class="form-group"> 
        @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" }) 
        <div class="col-md-10"> 
         @Html.PasswordFor(m => m.Password, new { @class = "form-control" }) 
         @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" }) 
        </div> 
       </div> 
       <div class="form-group"> 
        <div class="col-md-offset-2 col-md-10"> 
         <div class="checkbox"> 
          @Html.CheckBoxFor(m => m.RememberMe) 
          @Html.LabelFor(m => m.RememberMe) 
         </div> 
        </div> 
       </div> 
       <div class="form-group"> 
        <div class="col-md-offset-2 col-md-10"> 
         <input type="submit" value="Log in" class="btn btn-default" /> 
        </div> 
       </div> 
       <p> 
        @Html.ActionLink("Register as a new user", "Register") 
       </p> 
       @* Enable this once you have account confirmation enabled for password reset functionality 
        <p> 
         @Html.ActionLink("Forgot your password?", "ForgotPassword") 
        </p>*@ 
      } 
     </section> 
    </div> 
    <div class="col-md-4"> 
     <section id="socialLoginForm"> 
      @Html.Partial("_ExternalLoginsListPartial", new ExternalLoginListViewModel { ReturnUrl = ViewBag.ReturnUrl }) 
     </section> 
    </div> 
</div> 

AccountController.cs:

// POST: /Account/Login 
     [HttpPost] 
     [AllowAnonymous] 
     [ValidateAntiForgeryToken] 
     public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
     { 
      if (!ModelState.IsValid) 
      { 
       return View(model); 
      } 

      // This doesn't count login failures towards account lockout 
      // To enable password failures to trigger account lockout, change to shouldLockout: true 
      var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false); 
      switch (result) 
      { 
       case SignInStatus.Success: 
        return RedirectToLocal(returnUrl); 
       case SignInStatus.LockedOut: 
        return View("Lockout"); 
       case SignInStatus.RequiresVerification: 
        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
       case SignInStatus.Failure: 
       default: 
        ModelState.AddModelError("", "Invalid login attempt."); 
        return View(model); 
      } 
     } 

Я довольно много пользы шаблоны supplie d VS и изменил все в соответствии с тем, что я нашел в Интернете, поэтому я не могу понять, что не так. Похоже, что это должно сработать ...

+0

Вы включили и активировали ssl? хороший способ рассказать, является ли ваш сайт https: // по умолчанию в начале его адреса. – Abob

+0

Каково значение 'result' в вашем' AccountController'? Как ни странно, вы полностью уверены, что учетные данные * действительно верны, а не логика неверна? Возможно, попробуйте создать другую локальную учетную запись и войти в нее, чтобы быть абсолютно уверенным? –

+0

С помощью ваших ответов я понял проблему. При написании кода и тестировании и получении сбоев из-за нескольких обстоятельств при регистрации у меня были некоторые имена пользователей, которых нет в таблице SQL. Эти значения, очевидно, сохраняются где-то, и мне нужно как-то их удалять, так что ничего подобного не повторится. Чтобы правильно ответить на этот вопрос, кто-нибудь может предоставить решение для избавления от этих мошеннических имен пользователей? –

ответ

0

model.UserName можно сравнить с двумя полями: Email или UserName. Чтобы определить, какое поле использовать, зайдите в App_Start \ IdentityConfig.cs

Я считаю, что RequireUniqueEmail истинно (используйте электронную почту). Изменение этого параметра на false (UserName) должно решить проблему.

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    { 
     var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); 
     manager.UserValidator = new UserValidator<ApplicationUser>(manager) 
     { 
      RequireUniqueEmail = false 
     }; 
+0

Спасибо за ваши комментарии. Ruard, в IdentityConfig.cs Я изменил equireUniqueEmail на false, но это не сработало. Abob78, я запускаю это на своей локальной машине и еще не опубликовал его с текущими изменениями. Джефф Джеймс, на строке: var result = wait SignInManager.PasswordSignInAsync (model.UserName, model.Password, model.RememberMe, shouldLockout: false) ;, результат равен «Failure». model.UserName и модель.Пароль правильный. –

0

Поскольку вы не указали, как вы зарегистрировали свою учетную запись, давайте посмотрим, как работает шаблон.
Если вы зарегистрируетесь на сайте, то ваша электронная почта также будет вашим именем пользователя, поэтому, когда вы войдете на сайт и введите свой адрес электронной почты, он будет успешным, потому что письмо, которое вы должны ввести, совпадает с именем пользователя.
Однако, если вы не зарегистрировались на сайте и не указали, что имя пользователя отличается от адреса электронной почты, вам необходимо ввести свое имя пользователя. вы можете просмотреть свое имя пользователя из базы данных.