Формы Аутентификация понимание context.user.identity

Поскольку документация по этому процессу очень неопределенная и запутанная (или старая), я хотел убедиться, что я делаю это правильно и не пропускаю никаких шагов.

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

– в моем web.config у меня есть следующее –

       

Таким образом, у меня есть форма входа в систему с текстовым полем с именем пользователя / паролем и этой кнопкой:

  

Внутри Login_Authenticate я делаю следующее:

 protected void Login_Authenticate(object sender, EventArgs e){ string userName = UserName.Text; string password = Password.Text; bool Authenticated = false; // Here's code that makes sure that Username and Password is CORRECT if(AuthClass.Authenticate(userName, password)){ Authenticated = true; } // error checking does happen here. if (Authenticated) { FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(30), rememberUserName, String.Empty, FormsAuthentication.FormsCookiePath); string encryptedCookie = FormsAuthentication.Encrypt(ticket); HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedCookie); cookie.Expires = DateTime.Now.AddMinutes(30); Response.Cookies.Add(cookie); //FormsAuthentication.RedirectFromLoginPage(userName, false); Response.Redirect("MainPage.aspx"); } } 

— в MasterPage.master.cs У меня есть следующая проверка в Page_Init () —

 if (Context.User.Identity.IsAuthenticated) { int userid = (int)Session["userid"]; if (userid == null) { userid = GetUserID(Context.User.Identity.Name); if (userid != null) { Session["userid"] = userid; } } } 

EDIT: — GLOBAL.ASAX; какой-то код, который я не совсем уверен, правильно или знаю, что он делает

 protected void Application_AuthenticateRequest(object sender, EventArgs e) { // look if any security information exists for this request if (HttpContext.Current.User != null) { // see if this user is authenticated, any authenticated cookie (ticket) exists for this user if (HttpContext.Current.User.Identity.IsAuthenticated) { // see if the authentication is done using FormsAuthentication if (HttpContext.Current.User.Identity is FormsIdentity) { // Get the roles stored for this request from the ticket // get the identity of the user FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity; //Get the form authentication ticket of the user FormsAuthenticationTicket ticket = identity.Ticket; //Get the roles stored as UserData into ticket string[] roles = { }; //Create general prrincipal and assign it to current request HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(identity, roles); } } } } 

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

Это все правильно? Или мне нужно что-то расшифровать?

Достаточно ли этого для безопасного входа в систему? Или я не должен беспокоиться о проверке подлинности форм и найти свой собственный способ сделать свои собственные cookies и самостоятельно управлять ими?

Способ записи ваших кодов будет сохраняться в сеансах браузера. Это может помочь понять основы происходящего.

Для методов проверки подлинности на основе файлов cookie существует три действия:

1) Login – проверяет учетные данные пользователя и создает и сохраняет cookie в своем браузере.

2) Выход – просто удаляет файл cookie из браузера (путем истечения срока действия файла cookie или его удаления)

3) Проверка запроса (часть, которая является вашим Application_AuthenticateRequest) – проверьте, существует ли файл cookie, и если да, получите идентификатор пользователя и роли и установите HttpContext.Current.User.

Как правило, модуль FormsAuthentication скрывает большую часть этого от вас. Похоже, ваш код пытается использовать некоторые элементы FormAuthentication (например, FormsAuthenticationTicket и FormsIdentity. Это прекрасно, пока вы получаете то, что хотите.

Ваш метод Login_Authenticate выглядит отлично ИСКЛЮЧАЕТ, что вы устанавливаете истечение срока действия в файле cookie. Это заставит cookie сохраняться, даже если вы закроете и снова откроете браузер. Поскольку это не то поведение, которое вы хотите, я бы не установил истечение срока действия cookie. Настройка это похоже на проверку флажка «запомнить меня».

Код в Application_AuthenticateRequest запускается каждый раз, когда страница подана из вашего приложения. Основная задача – установить HttpContext.Current.User. Как правило, если ни один пользователь не вошел в систему, Пользователь либо имеет значение null, либо анонимный пользователь. Если пользователь вошел в систему, это должно представлять пользователя.

Если вы делаете эти три вещи, то в любом месте вашего кода вы можете ссылаться на HttpContext.Current.User, чтобы решить, какой уровень информации вы хотите отображать. Например, если вы хотите ограничить страницу только администраторами, вы можете вызвать HttpContext.Current.Users.IsInRole («Администраторы») и перенаправить их от страницы, если вызов возвращает false.

Надеюсь это поможет.

Я немного опаздываю на эту тему, но для тех, кто пытается внедрить аутентификацию форм, сохраняя при этом все просто (например, я пытался), здесь приведена соответствующая самая последняя документация, которую я нашел в msdn: http://msdn.microsoft.com /en-us/library/xdt4thhy(v=vs.100).aspx

Короче говоря, не испортите настройки файлов cookie, проверяя их, создавая экземпляры билетов или принципала, … Оставляйте это в classе FormsAuthentication .

При входе в систему, когда ваш код имеет учетные данные проверки, и если они действительны, просто позвоните

 FormsAuthentication.RedirectFromLoginPage(yourUserId, false); 

Он устанавливает для вас cookie аутентификации, что в сочетании с redirectм достаточно. « false » означает, что вы не сохраняете авторизацию: он будет потерян при закрытии браузера (или тайм-аут авторизации).

При уже аутентифицированном запросе проверить код не нужно, чтобы убедиться, что ваша аутентификация действительна. Используйте Context.User.Identity.Name чтобы узнать, кто подключен (это будет строка yourUserId выше).

При явном выходе из системы

 FormsAuthentication.SignOut(); FormsAuthentication.RedirectToLoginPage(); 

И настроить проверку подлинности в web.config.

          

Обратите внимание, что для приложений MVC часть авторизации должна быть удалена из конфигурации и обработана с помощью AuthorizeAttribute зарегистрированной как глобальный атрибут фильтра, с использованием AllowAnonymousAttribute на controllerах или действий, требующих этого. (MVC 4, до этого он должен был создавать свои собственные атрибуты для обработки этого.)

В вашем теге авторизации есть проблема:

     

потому что вы хотите отклонить анонимных пользователей. Если вы исправите это, вы можете безопасно удалить все материалы с главной страницы и global.asax – вам не нужно переназначать личность форм на свой собственный пользовательский идентификатор, хранящийся в сеансе. Это пустая трата ресурсов, и я не думаю, что это значительно повышает безопасность вашего решения. Вы можете полагаться на cookies форм.

Полный рабочий процесс для Remember Me требует: 1. Написать пользовательские данные в файл cookie. 2. Прочтите эти пользовательские данные.

Даже если вы можете аутентифицировать запрос через cookie, это не означает, что объект HttpSession возобновляется для этого запроса.

http://www.codeproject.com/Articles/779844/Remember-Me

введите описание изображения здесь

Давайте будем гением компьютера.