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

Пользовательский IPrincipal с аутентификацией форм в ASP.NET MVC

Это должно быть просто, но я просто не могу понять это после всего моего поиска. Вот чего я хочу. У меня есть таблица пользовательских пользователей (сейчас нет роли), с которой я бы хотел разрешить. Для этого мне придется реализовать собственный поставщик членства, который я уже сделал. Мой вопрос заключается в том, как я могу настроить пользовательский IPrincipal для HttpContext.Current.User? Где это должно произойти? Скажем, у меня есть следующая настройка:

public class CustomMembershipProvider : MembershipProvider
{
   private IUserRepository _repository;

   public CustomMembershipProvider(IUserRepository repository)
   {
      _repository = repository;
   }

   public override bool ValidateUser(string username, string password)
   {
      //check user repository 
   }

   //additional methods omitted for brevity 
}

Затем у меня есть пользовательский класс, который реализует IPrincipal и IIdentity

 public class CustomUser : IPrincipal
    {
        public CustomUser(string name, int userId, string additionalInfo)
        {
            Identity = new CustomIdentity(name, userId, additionalInfo);
        }

        public IIdentity Identity { get; private set; }

        public bool IsInRole(string role)
        {
            return true;
        }
    }

    public class CustomIdentity : IIdentity
    {
        public CustomIdentity(string name, int userId, string additionalInfo)
        {
            Name = name;
            UserId = userId;
            AdditionalInfo = additionalInfo;
        }

        public string Name { get; private set; }

        public string AuthenticationType
        {
            get { return "CustomAuth"; }
        }

        public bool IsAuthenticated
        {
            get { return !String.IsNullOrEmpty(Name); }
        }

        public int UserId { get; private set; }
        public string AdditionalInfo { get; private set; }
    }

Итак, мой вопрос: где правильно установить Context.User в экземпляр этого пользовательского пользователя? Нужен ли мне специальный атрибут авторизации? Если да, то как это будет выглядеть?

4b9b3361

Ответ 1

Я предлагаю использовать базовый класс пользовательского контроллера для всех ваших контроллеров

Затем в OnAuthorization вызовите

protected override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
{
    // Actual Authentication
    HttpContext.User = user; 
    Thread.CurrentPrincipal = user;
    base.OnAuthorization(filterContext);
}

Я не совсем уверен, как вызвать поставщика членства, потому что я делаю это manuallt, но я думаю, что у вас есть статический доступ к Membership.Provider для выполнения фактической конструкции объекта.

Нужен ли мне специальный атрибут авторизации?

Нет. Обратите внимание на разницу аутентификации и авторизации: аутентификация устанавливает идентификатор пользователя в вашей системе. Авторизация разрешает или отклоняет конкретный запрос. Следовательно, AuthorizeAttribute также имеет параметр Roles, чтобы позволить действию вызывать только определенные пользователи.