Asp.Net аутентификация с адресом электронной почты - PullRequest
1 голос
/ 06 марта 2011

Я использую адрес электронной почты в качестве моего "имени пользователя" для входа в систему. Когда пользователь входит в систему, созданный объект User имеет адрес электронной почты в качестве имени, которое является неправильным. Фактическое имя - это другое поле в БД. Как войти в систему и пройти аутентификацию по адресу электронной почты, а затем загрузить правильное имя в объекте User?

Я использую проверку подлинности с помощью пользовательских MembershipProvider и RoleProvider.

правки ниже для уточнения

У меня есть пользовательский MembershipProvider, который проверяет пользователей по адресу электронной почты и паролю. Он вызывается базовым контролем входа и регистрируется в web.config.

<asp:Login ID="AdminLogin" runat="server" MembershipProvider="AdminMembershipProvider">
</asp:Login>

Web.Config:

<authentication mode="Forms">
        <forms loginUrl="Default.aspx" />
    </authentication>
    <membership defaultProvider="AdminMembershipProvider">
      <providers>
        <clear />
        <add name="AdminMembershipProvider"
             type="AdminMembershipProvider"
             connectionStringName="EvalSysConnectionString"
             />

      </providers>
    </membership>

Благодаря этому мои пользователи правильно вошли в систему. Однако он возвращает Context.User.Identity.Name адреса электронной почты. У меня есть имя и фамилия, хранящиеся в БД, и я хочу, чтобы это было Имя.

Я читаю различные посты, которые, кажется, указывают на то, что мне нужно создать файл Global.asax и переопределить метод PostAutheticateRequest для этого. Однако я не знаю, как поступить с этой стратегией.

<%@ Application Language="C#" %>

<script runat="server">

    protected void Application_PostAuthenticateRequest()
    {
        string test = HttpContext.Current.User.ToString();
    }

</script>

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

Ответы [ 4 ]

2 голосов
/ 06 марта 2011

Я полагаю, что вы спрашиваете: могу ли я изменить свойство Context.User.Identity.Name для отображения чего-то другого, кроме имени пользователя?

EDIT

Невозможно использовать реализацию свойства Context.User.Identity.Name , поскольку оно доступно только для чтения и для него задано имя пользователя без возможности его изменения.

Быстрое и простое решение

Вы можете написать метод, который вызывает хранимую процедуру (или запрос в вашем коде) в вашей базе данных, чтобы выполнить поиск на основе значения в Context.User.Identity.Name и возвращает First и Last. Вы можете сохранить результат в переменной Session или использовать объект Profile (как указано ниже).

Альтернативный раствор

Вы можете написать свою собственную реализацию IIdentity. Это то, чего я никогда не делал, поэтому у меня нет никаких отрывков, чтобы внести свой вклад. Однако эта ссылка должна дать вам место для начала. Я был бы осторожен с этим решением, поскольку вы теряете свой уникальный способ идентификации пользователя, если вы не добавите дополнительное свойство к вашей реализации IIdentity и не убедитесь, что вы приведете Context.User.Identity, когда бы на него ни ссылались, к вашей собственной реализации.

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

1 голос
/ 11 марта 2011

Вы можете определенно использовать поставщика профилей, как предложил Джимми.Или вы можете реализовать IPrincipal и установить свойство HttpContext.User в своем событии PostAuthenticateRequest.

По сути, вы просто делаете что-то вроде

        var userName = Database.GetUserName(httpContext);
        httpContext.User = new GenericPrincipal(new GenericIdentity(userName, "FORMS"), new[] {"UserRole1"});

Первая строка является примеромвызов вашего БД, чтобы получить имя пользователя.Вторая строка создает принципала и идентичность из этой информации, а затем присваивает ее свойству User HttpContext

1 голос
/ 06 марта 2011

Я бы сделал именно то, что вы сделали до этого, а затем сохранил бы имя пользователя, адрес и т. Д. В объекте Профиль .

Это так же просто, как добавить некоторую конфигурацию (web.config):

<profile>
  <providers>
    <clear />
    <add name="SqlProvider"
      type="System.Web.Profile.SqlProfileProvider"
      connectionStringName="SqlServices"
      applicationName="SampleApplication"
      description="SqlProfileProvider for SampleApplication" />
  </providers>
  <properties>
    <add name="Name" />
  </properties>
</profile>

А затем получить / установить его так:

txtName.Text = Profile.Name;
Profile.Name = txtName.Text;
0 голосов
/ 06 марта 2014
Dim username As String = Membership.GetUserNameByEmail(txtUsername.Text)
If (Membership.ValidateUser(username, txtPassword.Text)) Then

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

Как вы думаете, ребята.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...