Пользовательская аутентификация формы / Схема авторизации в ASP.net MVC

Я пытаюсь создать пользовательскую схему аутентификации в ASP.NET MVC, использующий аутентификацию формы. Идея, что у меня могли бы быть различные области на сайте, которым будут управлять - утверждающее лицо, и область обычного пользователя, и они будут использовать различные страницы входа в систему и т.д. Таким образом, это - то, что я хочу произойти.

  1. Пользовательский доступ ограничил страницу (прямо сейчас, мне защитили его с клиентом AuthorizeAttribute),
  2. Пользователь перенаправляется к определенной странице входа в систему (не та от Web.config).
  3. Удостоверения пользователя проверяются (по пользовательской databse схеме), и пользователь входит в систему.

Действительно ценил бы любую справку с этим!!!

Это - то, что я, что я имею до сих пор, и это не работает:

 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 };

        }
    }
}
8
задан Greg R 24 February 2010 в 20:59
поделиться

4 ответа

Я использовал комбинацию кода, предложенного 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);
        }
    }
}
15
ответ дан 5 December 2019 в 08:23
поделиться

ладно, вот так Код

там у вас есть папка 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; }
}
}
3
ответ дан 5 December 2019 в 08:23
поделиться

Разве не для этого нужны роли? Взгляните на авторизацию asp.net mvc с использованием ролей или взгляните на роли в целом

2
ответ дан 5 December 2019 в 08:23
поделиться

Я решил эту проблему до того, как у меня появился класс, который я использую для входа в систему

подпрограммы входа, чтения cookie, проверки cookie и у них есть модель, которая содержит

имя, адрес электронной почты, идентификатор, уровень пользователя

, тогда у вас просто есть свой собственный фильтр действий

например, [CustomAuth (MinAllowedLevel = 10)]

Я использую базовый класс для всех своих контроллеров, поэтому мне будет проще ссылку на все содержимое моего сеанса, а затем можно получить такую ​​информацию

var model = pictures.all().where(x => x.userid == users.ReadCookie.userID)

Я добавлю код завтра, если вы захотите, когда я вернусь в дневное время в Великобритании

скажем, 10 часов, я дам вам класс для всего сеанса и фильтр настраиваемых действий , который вы можете использовать, тогда все, что вам нужно, это таблица логинов с полем уровня пользователя, лучше всего с уровнями 10,20,30,40 в случае, если вам понадобится уровень между 1 и 2

0
ответ дан 5 December 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: