Возможно ли создать систему входа в систему с ASP.NET MVC, но не использовать MemberhipProvider?

У меня есть существующая firebase database с таблицей пользователей, и мы планируем взять базу данных и использовать ее для новой системы, созданной в ASP.NET MVC. Тем не менее, я не уверен в том, могу ли я создать систему входа в систему, которая не использует встроенный controller учетных записей или постоянный поставщик членства, чтобы мы все еще могли использовать существующую структуру таблицы.

Поэтому мой вопрос: возможно ли это? Или даже особенно трудно сделать, если это так?

Каков наиболее широко распространенный способ делать вещи и простейшие?

У меня было это одно и то же требование. У меня была своя собственная схема пользователя и роли, и я не хотел мигрировать в схему членства asp.net, но я хотел использовать фильтры действий ASP.NET MVC для проверки полномочий и ролей. Я должен был сделать довольно много рытья, чтобы узнать, что именно нужно сделать, но в конце концов это было относительно легко. Я избавлю вас от неприятностей и расскажу вам, что я сделал.

1) Я создал class, полученный из System.Web.Security.MembershipProvider. MembershipProvider имеет массу абстрактных методов для всех видов функций, связанных с проверкой подлинности, таких как забытый пароль, смена пароля, создание нового пользователя и т. Д. Все, что я хотел, это способность аутентифицироваться против моей собственной схемы. Поэтому мой class содержал в основном пустые переопределения. Я просто переопределил ValidateUser:

public override bool ValidateUser(string username, string password) { if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password)) return false; string hash = EncryptPassword(password); User user = _repository.GetByUserName(username); if (user == null) return false; return user.Password == hash; } 

2) Я создал class, полученный из System.Web.Security.RoleProvider. Опять же, у меня просто были пустые реализации для всего пуха, который мне не нужен, как создание и изменение ролей. Я просто перепробовал два метода:

 public override string[] GetRolesForUser(string username) { User user = _repository.GetByUserName(username); string[] roles = new string[user.Role.Rights.Count + 1]; roles[0] = user.Role.Description; int idx = 0; foreach (Right right in user.Role.Rights) roles[++idx] = right.Description; return roles; } public override bool IsUserInRole(string username, string roleName) { User user = _repository.GetByUserName(username); if(user!=null) return user.IsInRole(roleName); else return false; } 

3) Затем я включил эти два classа в свой web.config:

             

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

Всякий раз, когда кто-то говорит вам, что что-то связанное с безопасностью «легко», они почти всегда ошибаются. В безопасности есть много тонкостей, которые, как правило, не хватает специалистам.

В частности, любая форма аутентификации, которая явно не связана с кешированием, по своей сути нарушена. Когда результат действия кэшируется, это происходит в ASP.NET, не обязательно в стеке ASP.NET MVC. Если вы изучите исходный код AuthorizeAttribute, вы увидите, что он содержит немного сложный, но эффективный код, гарантирующий, что он всегда выполняется, даже когда кешируется результат действия.

Лучший способ, на сегодняшний день, настроить аутентификацию ASP.NET MVC – это написать собственный поставщик членства ASP.NET. Я не буду утверждать, что это безопасно, но есть меньше способов попасть в проблему с нарушенной реализацией безопасности на этом маршруте, а затем другими способами. Существенным преимуществом этого метода является то, что вы можете заменить другую систему авторизации почти в любое время без изменения кода.

Если вы должны реализовать пользовательский атрибут MVC, тогда вы должны подтип AuthorizeAttribute и переопределить AuthorizeCore, внимательно следя за комментариями в исходном коде, касающемся безопасности streamов.

Конечно вы можете. Я сделал это для моих проектов, полностью игнорирующих поставщика членства.

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

Для атрибута вы можете определить любые параметры, необходимые для поддержки вашей модели аутентификации / авторизации.

 public class AuthorizationAttribute : ActionFilterAttribute, IActionFilter { public MyRole UserRole { get; set; } void IActionFilter.OnActionExecuting (ActionExecutedContext filterContext) { // Decide whether to grant access to the action or redirect away } } [Authorization (UserRole = MyRole.All)] public class UserController : Controller { [Authorization (UserRole = MyRole.Admin)] public ActionResult Delete () { } } 

Что касается выраженной в комментариях озабоченности. Да, включение кэша вывода будет мешать авторизации. Просто нужно знать об этом.

Объяснение проблемы: Совет ASP.NET MVC # 40 – Не кэшировать страницы, требующие авторизации

У вас есть как минимум две возможности

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

Второй вариант можно использовать и с обычными веб-формами.

  • Является ли Facebook провайдером OpenID?
  • Использование SymDony2 AccessDeniedHandlerInterface
  • Как защитить MongoDB с именем пользователя и паролем
  • Аутентификация с помощью двух разных таблиц
  • Добавить Keypair в существующий экземпляр EC2
  • Ошибка при вызове API API Azure Management при аутентификации с помощью azure active directory
  • Настройка Spring Security 3.x для создания нескольких точек входа
  • Неисправность получения ClaimsPrincipal при использовании EasyAuth для аутентификации против AAD в Azure App Service в веб-приложении Asp.Net Core
  • Перенаправление на предыдущую страницу после аутентификации в node.js с использованием файла паспорт.js
  • Как продлить проверку подлинности ServiceStack
  • Состояние веб-аутентификации - сеанс против Cookie?
  • Давайте будем гением компьютера.