У меня есть проект .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.
Если вы создаете проект из шаблона, он по существу доставит вас туда. Вы пытаетесь использовать подход, основанный на БД, или настраиваемые таблицы? Если это так, вы определенно зашли слишком далеко, и существует более простой способ. – Shoe
Код-сначала, а не db-first. Если в таком случае я зашел слишком далеко? – levininja
Можете ли вы попробовать добавить это в свой signinmanager? public override Task CreateUserIdentityAsync (Пользователь пользователя) {return user.GenerateUserIdentityAsync ((UserManager) UserManager);} –
Shoe