2015-05-26 2 views
3

Я создаю новое веб-приложение, которое должно аутентифицировать пользователей по сравнению с существующей пользовательской таблицей, которая существует из другого веб-приложения. Регистрация пользователя, забытый пароль и т. Д. Обрабатываются в этом приложении. Все, что мне нужно в моем новом приложении, - это логин.ASP.NET MVC Identity с существующей таблицей пользователей

Я задавался вопросом, можно ли перезаписать некоторый класс Identity, чтобы указать на эту таблицу для аутентификации пользователя, чтобы я мог использовать существующие функции Identity, такие как атрибут [Authorize] на контроллерах, и перенаправить обратно на страницу входа и т. Д. .

+0

Возможно, это помогает ... http://stackoverflow.com/a/29600215/894792? – Luke

ответ

1

У меня была такая же ситуация, как у вас, когда пыталась обновить мою устаревшую систему до аутентификации OWIN, у меня также была своя собственная таблица пользователей и процесс проверки подлинности, который совершенно отличается от предложений ASP.NET Identity.

Во-первых, я попытался настроить ASP.NET Identity, но он не был отсортирован таким образом. Моя мысль Identity была болезненной и намного более сложной для настройки для устаревшего приложения, поскольку в ней много абстрактных уровней.

В конце концов я придумал решение, чтобы разделить идентификатор ASP.NET и управлять идентификацией претензии самостоятельно. Это невероятно просто, мой ниже простой демонстрационный код, как войти в систему с Owin без ASP.NET Identity, надеюсь, что помогает:

private void OwinSignIn(User user, bool isPersistence = false) 
{ 
    var claims = new[] { 
       new Claim(ClaimTypes.Name, user.Name), 
       new Claim(ClaimTypes.Email, user.Email) 
      }; 

    var identity = new ClaimsIdentity(claims, DefaultApplicationTypes.ApplicationCookie); 

    var roles = _roleService.GetByUserId(user.Id).ToList(); 
    if (roles.Any()) 
    { 
     var roleClaims = roles.Select(r => new Claim(ClaimTypes.Role, r.Name)); 
     identity.AddClaims(roleClaims); 
    } 

    var context = Request.GetOwinContext(); 
    var authManager = context.Authentication; 

    authManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistence }, identity); 
} 

[HttpPost] 
public ActionResult Login(LoginViewModel model, string returnUrl) 
{ 
    if (!ModelState.IsValid) 
     return View(); 

    var user = _userService.GetByEmail(model.Email); 
    if (user != null && (user.Password == model.Password)) 
    { 
     OwinSignIn(user, model.RememberMe); 
     return RedirectToLocal(returnUrl); 
    } 

    ModelState.AddModelError("", "Invalid email or password"); 
    return View(); 
} 
+0

Это действительно не так больно, если вы сделаете так, чтобы ваша база данных соответствовала требуемому формату или вы сначала используете код – Luke

+0

@Coulton: мы не используем EF, даже наша схема базы данных для аутентификации пользователя и авторизации отличается от ASP .NET Identity предлагает. –

+1

Достаточно честный. Мне очень нравится простота этого. – Luke

0

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

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

Вы всегда можете написать свое собственное поведение OWIN. См. Пример @Cuong Le

+0

Если у вас есть гибкость для массажа существующего макета базы данных, чтобы он соответствовал макету Identity (или вы можете сопоставить его с использованием кода), тогда он должен хорошо работать с существующей базой данных. См. Http://stackoverflow.com/a/29600215/894792 – Luke

+0

Разве это не то же самое? База данных должна соответствовать минимальному макету и формату фреймворка Identity. Я немного переписаю свой ответ. –