Я пытаюсь создать пользовательскую схему аутентификации в ASP.NET MVC, использующий аутентификацию формы. Идея, что у меня могли бы быть различные области на сайте, которым будут управлять - утверждающее лицо, и область обычного пользователя, и они будут использовать различные страницы входа в систему и т.д. Таким образом, это - то, что я хочу произойти.
Действительно ценил бы любую справку с этим!!!
Это - то, что я, что я имею до сих пор, и это не работает:
public class AdministratorAccountController : Controller
{
public ActionResult Login()
{
return View("Login");
}
[HttpPost]
public ActionResult Login(AdministratorAccountModels.LoginModel model, string returnUrl)
{
if (ModelState.IsValid)
if (model.UserName == "admin" && model.Password == "pass") // This will be pulled from DB etc
{
var ticket = new FormsAuthenticationTicket(1, // version
model.UserName, // user name
DateTime.Now, // create time
DateTime.Now.AddSeconds(30), // expire time
false, // persistent
""); // user data
var strEncryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, strEncryptedTicket);
Response.Cookies.Add(cookie);
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
// If we got this far, something failed, redisplay form
return View(model);
}
[AdministratorAuthorize]
public ActionResult MainMenu()
{
return View();
}
public class AdministratorAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var authenCookie = httpContext.Request.Cookies.Get(FormsAuthentication.FormsCookieName);
if (authenCookie == null) return false;
var ticket = FormsAuthentication.Decrypt(authenCookie.Value);
var id = new FormsIdentity(ticket);
var astrRoles = ticket.UserData.Split(new[] { ',' });
var principal = new GenericPrincipal(id, astrRoles);
httpContext.User = principal;
return true;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
var model = new AdministratorAccountModels.LoginModel();
var viewData = new ViewDataDictionary(model);
filterContext.Result = new ViewResult { ViewName = "Login", ViewData = viewData };
}
}
}
Я использовал комбинацию кода, предложенного minus4, и моего собственного кода выше, чтобы создать этот упрощенный сценарий, который может помочь кому-то другому. Я добавил несколько комментариев о вещах, которые сначала смущали меня.
public class AdministratorAccountController : Controller
{
public ActionResult Login()
{
return View("Login");
}
[HttpPost]
public ActionResult Login(AdministratorAccountModels.LoginModel model, string returnUrl)
{
if (ModelState.IsValid)
// Here you would call a service to process your authentication
if (model.UserName == "admin" && model.Password == "pass")
{
// * !!! *
// Creating a FromsAuthenticationTicket is what
// will set RequestContext.HttpContext.Request.IsAuthenticated to True
// in the AdminAuthorize attribute code below
// * !!! *
var ticket = new FormsAuthenticationTicket(1, // version
model.UserName, // user name
DateTime.Now, // create time
DateTime.Now.AddSeconds(30), // expire time
false, // persistent
""); // user data, such as roles
var strEncryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, strEncryptedTicket);
Response.Cookies.Add(cookie);
// Redirect back to the page you were trying to access
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
// If we got this far, something failed, redisplay form
return View(model);
}
[AdminAuthorize]
public ActionResult MainMenu()
{
return View();
}
public class AdminAuthorize : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.RequestContext.HttpContext.Request.IsAuthenticated)
{
// Redirect to the needed login page
// This can be pulled from config file or anything else
filterContext.HttpContext.Response.Redirect("/AdministratorAccount/Login?ReturnUrl="
+ HttpUtility.UrlEncode(filterContext.HttpContext.Request.RawUrl));
}
base.OnActionExecuting(filterContext);
}
}
}
ладно, вот так Код
там у вас есть папка ActionFilters (AuthAccess.cs) Папка плагинов (безопасность .cs (шифрование / дешифрование файлов cookie), SessionHandler.cs (все вопросы входа в систему)) Папка контроллеров (BaseController.cs и exampleController (покажет, как использовать) и файл SQL loginTable .
Я использую mysql, поэтому вам может потребоваться внести поправки, также я использую дозвуковой режим, чтобы моя модель была оттуда и была в пустой папке моделей.
действительно простой в использовании, оставит его. какое-то время наслаждайтесь
не-а модель cookie здесь извините:
using System;
namespace TestApp.Models
{
public class CookieModel
{
public string CurrentGuid { get; set; }
public DateTime LoginTime { get; set; }
public Int32 UserLevel { get; set; }
public Int32 LoginID { get; set; }
public bool isValidLogin { get; set; }
public string realUserName { get; set; }
public string emailAddress { get; set; }
}
}
Разве не для этого нужны роли? Взгляните на авторизацию asp.net mvc с использованием ролей или взгляните на роли в целом
Я решил эту проблему до того, как у меня появился класс, который я использую для входа в систему
подпрограммы входа, чтения cookie, проверки cookie и у них есть модель, которая содержит
имя, адрес электронной почты, идентификатор, уровень пользователя
, тогда у вас просто есть свой собственный фильтр действий
например, [CustomAuth (MinAllowedLevel = 10)]
Я использую базовый класс для всех своих контроллеров, поэтому мне будет проще ссылку на все содержимое моего сеанса, а затем можно получить такую информацию
var model = pictures.all().where(x => x.userid == users.ReadCookie.userID)
Я добавлю код завтра, если вы захотите, когда я вернусь в дневное время в Великобритании
скажем, 10 часов, я дам вам класс для всего сеанса и фильтр настраиваемых действий , который вы можете использовать, тогда все, что вам нужно, это таблица логинов с полем уровня пользователя, лучше всего с уровнями 10,20,30,40 в случае, если вам понадобится уровень между 1 и 2