Пользовательский вход в приложение MVC3 - PullRequest
0 голосов
/ 24 декабря 2011

Я хочу создать веб-сайт, который отображает информацию о пользователе (например, пользователь видит свои собственные записи при входе в систему). Я не хочу использовать интернет-приложение MVC3 с провайдером членства по умолчанию, поскольку мне хотелось бы создать собственную аутентификацию. Я нашел некоторые ссылки в Интернете, но чувствую, что мне нужно больше источников для чтения. Мой проект MVC3, Entity Framework с кодом в первую очередь. Спасибо,

Ответы [ 2 ]

3 голосов
/ 24 декабря 2011
0 голосов
/ 24 декабря 2011

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

Практически все, что я нашел, предлагали просто написать свой собственный MemberShip Provider (как это предлагается (dknaack) и объект IPrincipal, чтобымне нужно добавить дополнительные поля, которые я хотел (это было проще, чем расширение данных профиля).

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

Вот дамп моего кода, чтобы вы начали:

using System;
using System.Collections.Specialized;
using System.Linq;
using System.Security.Principal;
using System.Web.Security;
using My.Company.Project.Entities;

namespace My.Company.Project.Classes
{
    public class ClassicMembershipProvider : MembershipProvider
    {
        public override void Initialize(string name, NameValueCollection config)
        {
            base.Initialize(name, config);
        }

        public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
        {
            throw new NotImplementedException();
        }

        public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
        {
            throw new NotImplementedException();
        }

        public override string GetPassword(string username, string answer)
        {
            throw new NotImplementedException();
        }

        public override bool ChangePassword(string username, string oldPassword, string newPassword)
        {
            throw new NotImplementedException();
        }

        public override string ResetPassword(string username, string answer)
        {
            throw new NotImplementedException();
        }

        public override void UpdateUser(MembershipUser user)
        {
            throw new NotImplementedException();
        }

        public override bool ValidateUser(string username, string password)
        {
            using (var entities = new ProjectEntities())
            {
                return entities.Buprofile
                           .Where(p => p.profileid == username &&
                                       p.profilepassword == password)
                           .Count() == 1;
            }
        }

        public override bool UnlockUser(string userName)
        {
            throw new NotImplementedException();
        }

        public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
        {
            throw new NotImplementedException();
        }

        public override MembershipUser GetUser(string username, bool userIsOnline)
        {
            throw new NotImplementedException();
        }

        public override string GetUserNameByEmail(string email)
        {
            throw new NotImplementedException();
        }

        public override bool DeleteUser(string username, bool deleteAllRelatedData)
        {
            throw new NotImplementedException();
        }

        public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
        {
            throw new NotImplementedException();
        }

        public override int GetNumberOfUsersOnline()
        {
            throw new NotImplementedException();
        }

        public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new NotImplementedException();
        }

        public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new NotImplementedException();
        }

        public override bool EnablePasswordRetrieval
        {
            get { return false; }
        }

        public override bool EnablePasswordReset
        {
            get { return false; }
        }

        public override bool RequiresQuestionAndAnswer
        {
            get { return false; }
        }

        public override string ApplicationName
        {
            get { throw new NotImplementedException(); }
            set { throw new NotImplementedException(); }
        }

        public override int MaxInvalidPasswordAttempts
        {
            get { throw new NotImplementedException(); }
        }

        public override int PasswordAttemptWindow
        {
            get { throw new NotImplementedException(); }
        }

        public override bool RequiresUniqueEmail
        {
            get { return true; }
        }

        public override MembershipPasswordFormat PasswordFormat
        {
            get { throw new NotImplementedException(); }
        }

        public override int MinRequiredPasswordLength
        {
            get { throw new NotImplementedException(); }
        }

        public override int MinRequiredNonAlphanumericCharacters
        {
            get { throw new NotImplementedException(); }
        }

        public override string PasswordStrengthRegularExpression
        {
            get { throw new NotImplementedException(); }
        }
    }
}

Вы можете подключить его, добавив / обновив в своем web.config:

<membership defaultProvider="ClassicMembershipProvider" userIsOnlineTimeWindow="15">
  <providers>
    <clear />
    <add name="ClassicMembershipProvider" type="My.Company.Project.Classes.ClassicMembershipProvider" applicationName="MyApplication" />
  </providers>
</membership>

Я также создал собственный IPrincipal (основанный на http://blog.codevelop.dk/post/2007/11/24/ASPNET-20-Forms-authentication-Keeping-it-customized-yet-simple.aspx), который позволяет хранить различные биты данных о пользователе в свойстве UserData (как уже упоминалось, в этом случае это выглядело намного проще, чем расширять профиль пользователя).).

Вы можете получить доступ к UserData пользователя после входа в систему, выполнив приведение User: ((MyPrincipal) User) .UserData - Я переобъел свойство User в базовом классе своей страницы, чтобы я мог просто использовать User.хотя в будущем:

/// <summary>
/// Override User and return a MyPrincipal with its additional data
/// </summary>
public new MyPrincipal User
{
    get { return HttpContext.Current.User is MyPrincipal ? (MyPrincipal) HttpContext.Current.User : null; }
}

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

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