2014-11-25 3 views
5

У меня есть проект .NET, MVC 5, EF 6. Мы подключаемся к внешнему проекту/базе данных для аутентификации пользователей, поэтому все, что нам нужно реализовать, - это методы входа и выхода, а не обычные методы CRUD. Я знаю, что EF правильно сопоставлен с таблицами внешней базы данных; Я вижу, что он получает пользователей.Почему SignInAsync() OWIN не задает IsAuthenticated (или другие переменные аутентификации)?

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

В Startup.Auth.cs у меня есть:

app.CreatePerOwinContext<CustomUserManager>(CustomUserManager.Create); 
    app.CreatePerOwinContext<CustomSignInManager>(CustomSignInManager.Create); 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login"), 
     Provider = new CookieAuthenticationProvider 
     { 
      OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
       validateInterval: TimeSpan.FromMinutes(30), 
       regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager) 
      ) 
     }, 
     CookieSecure = CookieSecureOption.Always 
    }); 

У меня также есть классы, реализующие интерфейсы IUserStore<User>, UserManager<User> и SignInManager<User, string>. Мой CustomUserStore имеет следующий метод, реализованный, потому что источник говорит, что он выполняет вход в систему. Я реализовал фиктивные методы для других функций (т.е. DeleteAsync(), UpdateAsync() и т.д.), которые не должны быть реализовано, потому что мы доступ только для чтения к этой внешней БД пользователей ...

public async Task<User> FindByIdAsync(string id) 
    { 
     using (ExternalDBContext context = new ExternalDBContext()) 
     { 
      return await Task.Run(() => 
       context.Users.Where(u => u.Id == id).ToList().FirstOrDefault() 
      ); 
     } 
    } 

Тогда в моем AccountController.Login() у меня есть:

 await CustomSignInManager.SignInAsync(model, true, true); 
     return RedirectToAction("Index", "Dashboard"); 

Но после того, как SignInAsync(), User.Identity.IsAuthenticated все еще false и поэтому ни один из AUTHORIZE не атрибуты не будут работать.

# 1 Возможная проблема: Я интересно, если проблема с AuthenticationManager, который SignInManager опирается. Вот как я его реализации в Startup.Auth.cs:

public class CustomSignInManager : SignInManager<User, string> 
{ 
    public CustomSignInManager(CustomUserManager userManager, IAuthenticationManager authenticationManager) 
     : base(userManager, authenticationManager) 
    { 
    } 
    public static CustomSignInManager Create(IdentityFactoryOptions<CustomSignInManager> options, IOwinContext context) 
    { 
     return new CustomSignInManager(context.GetUserManager<CustomUserManager>(), context.Authentication); 
    } 
} 

Он получает Microsoft.Owin.Security.AuthenticationManager из контекста.

Итак: мне нужно сделать что-то еще для реализации аутентификации?

# 2 Возможная неисправность: Я заметил, что мой CustomUserManager имеет свойство SupportsUserLogin = false. That property требует выполнения IUserLoginStore. Я не хочу реализовывать еще один бесполезный интерфейс, полный методов, которые я не использую!

Итак: имеет значение, если SupportsUserLogin = false? Нужно ли мне реализовать этот интерфейс или есть ли способ обойти это?

Сводка: В целом это слишком сложно для проекта, где все, что я хочу сделать, это ЛОГОТИРОВАТЬ ПОЛЬЗОВАТЕЛЯ. И вышел. Я не хочу создавать/обновлять/удалять пользователей. Я просто хочу войти в систему и иметь User.Identity.IsAuthenticated = true, пока они не выйдут из системы. Таким образом, любые идеи о том, как отступить к более простому использованию системы Identity, будут очень благодарны. Мой самый большой вопрос: вообще ли я иду по правильному пути.

Edit: я определенно не хочу, чтобы сделать # 2 (реализации IUserLoginStore) because that is for doing external authentication.

+0

Если вы создаете проект из шаблона, он по существу доставит вас туда. Вы пытаетесь использовать подход, основанный на БД, или настраиваемые таблицы? Если это так, вы определенно зашли слишком далеко, и существует более простой способ. – Shoe

+0

Код-сначала, а не db-first. Если в таком случае я зашел слишком далеко? – levininja

+0

Можете ли вы попробовать добавить это в свой signinmanager? public override Task CreateUserIdentityAsync (Пользователь пользователя) {return user.GenerateUserIdentityAsync ((UserManager) UserManager);} – Shoe

ответ

0

Вы используете https? если не удалите эту строку: CookieSecure = CookieSecureOption.Всегда

также нет необходимости в IUserLoginStore (то есть только для внешнего AUTH, как Facebook) подробнее о том, что: here

сторона примечание: изменение Task.Factory.StartNew к Task.Run link

+0

Да, я использую https, это должно быть очевидно. Спасибо за заметку о IUserLoginStore. – levininja