Как установить правильные текстовые поля имени пользователя и пароля?

У меня есть экран входа с именем пользователя и паролем, но у него также есть поле компании, которое похоже на домен.

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

например. Пользователь: Tom, Domain: Netweb, Pass: test

Том регистрируется один раз и нажимает, чтобы сохранить свой пароль. В следующий раз, когда он вернется, он войдет в Netweb в домен и вернется, он заполняет пароль, который был сохранен для этого домена, а затем он может ввести свое имя пользователя впоследствии.

Что я могу сделать по этому поводу? Есть ли способ установить имя пользователя, чтобы он не использовал компанию или способ использовать верхние два перед добавлением пароля?

example of username issue

Мой код ниже:

<tr class="center">
    <td class="center">User Name
        <br />
        <asp:TextBox ID="txtUser" runat="server"></asp:TextBox>
    </td>
</tr>
<tr class="center">
    <td class="center">Company
        <br />
        <asp:TextBox ID="txtCompany" runat="server"></asp:TextBox>
    </td>
</tr>
<tr class="center">
    <td class="center">Password
        <br />
        <asp:TextBox ID="txtPass" runat="server" TextMode="Password"></asp:TextBox>
        <br />Remember me?
        <asp:CheckBox ID="chkPersistCookie" runat="server" AutoPostBack="false" />
        <br />
        <br />
        <asp:Button ID="btnSubmit" runat="server" Text="Login" CssClass="center" OnClick="btnSubmit_Click" />
        <br />
        <asp:Label ID="lblMessage" runat="server"></asp:Label>
        <br />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtUser" ErrorMessage="Please enter a user name" ForeColor="Red"></asp:RequiredFieldValidator>
        <br />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="txtCompany" ErrorMessage="Please enter a company" ForeColor="Red"></asp:RequiredFieldValidator>
        <br />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtPass" ErrorMessage="Please enter a password" ForeColor="Red"></asp:RequiredFieldValidator>
    </td>
</tr>

Ответ 1

Решено на данный момент путем замены текстовых полей в конце.

Ответ 2

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

Это что-то вроде этого

<input type="text" name="someInputName" autocomplete="off|on" />

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

Что вы здесь видите, это функция автозаполнения формы браузерами. В этом случае браузер сохраняет данные пользователя, а затем вы можете просто удалить эти данные из браузера, перейдя в настройки браузера и еще больше под капотом, а затем выбрав "Сохраненные пароли" и удалив пароль для своего сайта.

В противном случае у вас нет контроля в предотвращении того, что пользователь хочет делать. Но, как это делает Google. Вы можете реализовать свою идею безопасности.

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

Есть и другие вещи, которые вы можете сделать тоже. Например, получая адрес электронной почты пользователя на одной странице, а затем получая пароль на следующей странице. Так же, как Payza.

Ответ 3

Если проблема связана с автоматическим запросом пароля в текстовом поле, вам необходимо отключить свойство автозаполнения текстового поля

Ответ 4

С полем автозаполнения, как это есть, вам лучше всего сделать так много полезных указателей на браузер, насколько это возможно. В вашем случае это будет что-то вроде:

<asp:TextBox ID="username" x-autocompletetype="given-name" runat="server"></asp:TextBox>
<asp:TextBox ID="txtCompany" x-autocompletetype="organization" runat="server"></asp:TextBox>
<asp:TextBox ID="password" x-autocompletetype="password" runat="server" TextMode="Password"></asp:TextBox>

Обратите внимание, что это предназначено для самих форм, а не для типов входа, на которые вы ссылаетесь. Кроме того, они протестированы с помощью HTML Form Inputs - я предполагаю, что ASP должен передавать пользовательские атрибуты в результирующий HTML-код, но это возможный сбой. ASP ID наверняка отображает HTML Input name.


Это был очень интересный вопрос для меня, потому что Autocomplete, похоже, является одной из тех вещей, которые еще не приближаются к стандарту.

HTML5 W3 Spec

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

Команда из Google, похоже, хочет изменить это с помощью своего предложения

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

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

Здесь хорошая ссылка, которая описывает, как это предложение будет реализовано:

<input type="text" name="firstname" value="" x-autocompletetype="given-name">  
<input type="text" name="doesn-matter" value="" x-autocompletetype="family-name">  
<input id="email" type="text" name="email" value="" x-autocompletetype="email">

Дальнейшие ссылки:

Ответ 5

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

Используйте ClientIDMode = "Static" для этого, так что .net не генерирует Id для вас.

Ответ 7

Если ваша единственная проблема заключается в том, что вы можете автозавершить пароль, вы можете отключить это через кодовое слово, выполнив следующие действия:

txtPass.Attributes.Add("autocomplete", "off");

Ответ 8

Используйте для домена/компании:

<asp:TextBox id="Textbox1" runat="server" autocomplete="off"></asp:TextBox>

Или из CodeBehind:

Textbox1.Attributes.Add("autocomplete", "off");

Он отключит автозаполнение для компании с текстовыми полями.

Если это не решит проблему, альтернативный способ - использовать некоторую проверку, например:

  • Когда домен/компания введена, проверяет, предоставлено ли имя пользователя.

  • Если имя пользователя не указано и пароль присутствует, дайте сообщение об ошибке, чтобы заполнить имя пользователя первым и намеренно заполнить текстовые поля для Компании и пароль.

Некоторый код в jquery будет выглядеть следующим образом:

$(txtDomain).focusout(function() {
      if($txtUserName).val().trim()=="" && $(txtDomain).val().trim()!="" && $(txtPass).val().trim()!="")
      {
         alert('Please fill the username first');
         $(txtPass).val('');
         $(txtDomain).val('');
      }

Я знаю, что это нехорошее решение, а также проблемы с юзабилити. Но это может быть последним средством, если что-то еще не работает.

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

Ответ 9

Браузер автоматически заполняет учетные данные в неправильном текстовом поле?

Иногда я замечаю это странное поведение в Chrome и Safari, когда есть поля пароля в той же форме. Я думаю, браузер ищет поле пароля для вставки сохраненных учетных данных. Затем он автоматически заполняет (только гадание из-за наблюдения) ближайшего текстового поля ввода, которое появляется перед полем пароля в DOM. Поскольку браузер является последним экземпляром, и вы не можете его контролировать, иногда даже autocomplete = off не будет препятствовать заполнению учетных данных. Это исправление для чтения работало для меня.

По мере того как вы меняли заказ на "user... password... company", он работает. Опять же, браузер будет использовать поле до того, как пароль, теперь пользователь, заполнит учетные данные.

зафиксировать автозаполнение браузера в: set readonly и установить функцию writeble on focus (щелчок и вкладка)

 <input type="password" readonly  
     onfocus="$(this).removeAttr('readonly');"/>

Ответ 10

Управление файлом cookie вручную, Это пример jQuery.

     $("#chkPersistCookie").change(function() {

        if(this.checked) {

        var username = $('#txtUser').attr("value");
        var password = $('#txtPass').attr("value");

        $.cookie('username', username, { expires: 14 });
        $.cookie('password', password, { expires: 14 });
        $.cookie('remember', true, { expires: 14 });

    } else {
        $.cookie('username', null);
        $.cookie('password', null);
        $.cookie('remember', null);

    }
    });

Чтобы получить файл cookie и назначить его элементу управления, используйте

var remember = $.cookie('remember');
    if ( remember == 'true' ) {

        $("#chkPersistCookie").attr("checked",true)
        var username = $.cookie('username');
        var password = $.cookie('password');

        $('#txtUser').attr("value", username);
        $('#txtPass').attr("value", password);
    }