Я пытаюсь добавить однопользовательскую аутентификацию ASP.NET Identity 3.0 в «шаблон ASP.NET Core Application Angular» в Visual Studio 2017. Здесь я создал репозиторий GitHub:
https://github.com/DapperDanH/NutmegStackoverflow
На самом деле в этом проекте еще не так много. С высокого уровня, это то, что я сделал:
- Создал новое «веб-приложение ASP.NET Core» с .NET Core и ASP.NET Core 2.0 и выбрал шаблон Angular в Visual Studio.
- Я добавил первые файлы ASP.Identity, EF Core и шаблонного кода из существующей базы данных.
- Я скопировал и вставил многие контроллеры и представления из «Основного веб-приложения ASP.NET» с шаблоном веб-приложения, используя пример проекта «Индивидуальная учетная запись пользователя».
- Я изменил Startup.cs (добавил service.AddIdentity и app.UseAuthentication() и т. д.)
Моя цель — использовать стандартный ASP.NET MVC для частей аутентификации.
Кажется, все работает. Веб-приложение запускается и показывает домашнюю страницу. Я создал ссылки на страницы «Регистрация» и «Вход». Я могу успешно зарегистрировать нового пользователя, и новый пользователь будет добавлен в базу данных. Пользователь может ввести свою информацию на странице входа, и метод AccountController.Login возвращает успех методу PasswordSignInAsync:
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
Проблема в том, что файл cookie авторизации не создается. Что ж, примерно в 99% случаев файл cookie НЕ создается, но время от времени он создается.
Моя интуиция подсказывает, что проблема может быть в Startup.cs. Вот код, который я использую:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<NutmegContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<User, AppRole>()
.AddEntityFrameworkStores<NutmegContext>()
.AddDefaultTokenProviders();
// Add application services.
services.AddTransient<IEmailSender, EmailSender>();
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
HotModuleReplacement = true
});
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapSpaFallbackRoute(
name: "spa-fallback",
defaults: new { controller = "Home", action = "Index" });
});
}
Я очень надеюсь, что кто-то может мне помочь. Чтобы увидеть это в действии:
- Загрузите проект здесь: https://github.com/DapperDanH/NutmegStackoverflow
- Запустите Update-Database в консоли диспетчера пакетов, убедившись, что проектом по умолчанию является Nutmeg.Data.
- Запустите приложение, убедившись, что Nutmeg.Web является стартовым проектом.
- Нажмите кнопку «Регистрация» и зарегистрируйте нового пользователя. Проверьте БД и обратите внимание, что пользователь добавлен.
- Нажмите Войти. Введите ту же информацию, что и на шаге 4. Был ли создан файл cookie?
Надеясь, что кто-то может мне помочь. Спасибо, что прочитали этот длинный пост!
Спасибо, Дэн