#c# #asp.net-mvc #asp.net-mvc-4
#c# #asp.net-mvc #asp.net-mvc-4
Вопрос:
У меня есть веб-сайт, где я добавляю аутентификацию прямо сейчас, следуя этому руководству (http://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-1 ) используя ASP.NET Идентификация, Owin и т.д… В настоящее время вместо использования помощников html и использования приведенного ниже фрагмента для просмотра я создал свою собственную пользовательскую форму, но по какой-то причине я не думаю, что я правильно передаю URL возврата, из-за чего я получаю ошибку 404. Кто-нибудь, пожалуйста, может мне помочь? Я новичок в .NET MVC. Заранее спасибо.
@Html.ValidationSummary(true)
@using (Html.BeginForm())
{
@Html.EditorForModel()
<p>
<button type="submit">Log In</button>
</p>
}
Модель
public class LogInModel
{
[Required]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[HiddenInput]
public string ReturnUrl { get; set; }
}
Контроллер
[AllowAnonymous]
public class AuthController : Controller
{
// GET: Auth
[HttpGet]
public ActionResult LogIn(string returnUrl)
{
var model = new LogInModel
{
ReturnUrl = returnUrl
};
return View(model);
}
[HttpPost]
public ActionResult LogIn(LogInModel model)
{
if (!ModelState.IsValid)
{
return View();
}
// Don't do this in production!
if (model.Email == "admin@admin.com" amp;amp; model.Password == "#G16#")
{
var identity = new ClaimsIdentity(new[] {
new Claim(ClaimTypes.Name, "Admin"),
new Claim(ClaimTypes.Email, "Admin@Admin.com"),
new Claim(ClaimTypes.Country, "USA")
},
"ApplicationCookie");
var ctx = Request.GetOwinContext();
var authManager = ctx.Authentication;
authManager.SignIn(identity);
return Redirect(GetRedirectUrl(model.ReturnUrl));
}
// user authN failed
ModelState.AddModelError("", "Invalid email or password");
return View();
}
private string GetRedirectUrl(string returnUrl)
{
if (string.IsNullOrEmpty(returnUrl) || !Url.IsLocalUrl(returnUrl))
{
return Url.Action("index", "home");
}
return returnUrl;
}
public ActionResult LogOut()
{
var ctx = Request.GetOwinContext();
var authManager = ctx.Authentication;
authManager.SignOut("ApplicationCookie");
return RedirectToAction("index", "home");
}
}
Вид
<div class="col-md-4" style="margin-top:200px;">
@using (Html.BeginForm("LogInModel", "LogIn", FormMethod.Post, new { @class="form-horizontal" }))
{
<div class="form-group">
<label class="label label-default">Email Address</label>
<div class="form-control">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control"})
</div>
</div>
<div class="form-group">
<label class="label label-default">Password</label>
<div class="form-control">
@Html.TextBoxFor(m => m.Password, new { @class = "form-control" })
</div>
</div>
@Html.HiddenFor(m => m.ReturnUrl)
<button class="btn btn-default" type="submit">Log In</button>
}
</div>
Ответ №1:
Вы не используете Html.BeginForm
правильно.
Вместо:
Html.BeginForm("LogInModel", "LogIn", FormMethod.Post, new {})
Это должно быть:
Html.BeginForm("LogIn", "Auth", FormMethod.Post, new {})
Html.BeginForm("actionName", "controllerName", FormMethod.Post, new {})
Комментарии:
1. Спасибо. У меня это работает. Но у меня есть вопрос. Не является ли имя моего контроллера
AuthController
и неAuth
? Немного запутался в том, как это работает.2. Да, это так, но это asp.net соглашение об именовании по умолчанию в mvc. Он
ControllerFactory
автоматически добавляетсяController
в конце. Вы можете, конечно, переопределить поведение по умолчанию.