Подтвердить что ты не робот

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

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

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

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

<authentication mode="Forms">
      <forms loginUrl="~/Login.aspx" defaultUrl="Index.aspx" name=".ASPXFORMSAUTH" timeout="100" />
    </authentication>
    <authorization>
      <allow users="?" />
    </authorization>
    <machineKey decryption="AES" validation="SHA1" validationKey.......... />

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

<asp:Button ID="LoginButton" runat="Server" OnClick="Login_Authenticate" Text="Sign in" />

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

protected void Login_Authenticate(object sender, EventArgs e){
string userName = UserName.Text;
string password = Password.Text;

bool Authenticated = false;

// Here 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);
                }
            }
        }
    }

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

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

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

4b9b3361

Ответ 1

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

Для методов проверки подлинности на основе файлов 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.

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

Ответ 2

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

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

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

FormsAuthentication.RedirectFromLoginPage(yourUserId, false);

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

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

В случае явного выхода из системы вызовите

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

И проверьте подлинность форм в web.config.

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="yourLoginPage" defaultUrl="yourDefaultPageAfterLogin">
    </forms>
  </authentication>
  <authorization>
    <deny users="?" />
  </authorization>
</system.web>

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

Ответ 3

В вашем теге авторизации может возникнуть проблема:

<authorization>
  <deny users="?" />
  <allow users="*" />
</authorization>

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

Ответ 4

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

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

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

enter image description here