Я использую «новые» шаблоны проектов для приложений Angular SPA в dotnet core 2.1, как написано в статье Использование шаблона проекта Angular с ASP.NET Core .
Но в этой статье ничего не говорится о защите самого SPA.
Вся информация, которую я нахожу, касается защиты WEBAPI, но прежде всего я заинтересован в защите SPA.
Это означает: когда я открываю свой SPA, например, https://localhost:44329/ я хотел бы быть перенаправлен на сервер авторизации немедленно вместо нажатия какой-либо кнопки, которая будет выполнять аутентификацию.
Фон:
- Я должен убедиться, что только аутентифицированные пользователи могут видеть SPA.
- Я хочу использовать Предоставление кода авторизации для получения токенов обновления с моего сервера авторизации.
- Я не могу использовать Неявное предоставление , так как токены обновления не могут быть конфиденциальными в браузере
Текущий подход заключается в применении политики MVC, которая требует аутентифицированного пользователя. Но это может быть применено только к контроллеру MVC. Вот почему я добавил HomeController для обслуживания первого запроса.
См. Структуру проекта:
![enter image description here](https://i.stack.imgur.com/8Rk1h.png)
Мой Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = "CustomScheme";
})
.AddCookie()
.AddOAuth("CustomScheme", options =>
{
// Removed for brevity
});
services.AddMvc(config =>
{
// Require a authenticated user
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
// In production, the Angular files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
}
// 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();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseAuthentication();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
}
Текущее поведение: Когда я запускаю SPA, я сразу же перенаправляюсь на сервер авторизации из-за политики MVC. После успешной аутентификации я вижу Index метод домашнего контроллера, но не мой SPA.
Итак, вопрос в том, как я должен обслуживать свой SPA после перенаправления с сервера аутентификации?