Я использую "новые" шаблоны проектов для угловых приложений SPA в dotnet core 2.1, как написано в статье. Используйте шаблон Angular Project с ASP.NET Core.
Но в этой статье ничего не говорится о защите самого SPA. Вся информация, которую я нахожу, касается обеспечения WEBAPI, но в первую очередь я заинтересован в обеспечении SPA.
Это означает: когда я открываю свой SPA, например, https://localhost: 44329/ i, я бы сразу перенаправлялся на сервер авторизации, а не нажимал кнопку, которая будет выполнять аутентификацию.
Фон:
- Я должен убедиться, что только сертифицированным пользователям разрешено видеть SPA.
- Я хочу использовать лицензионный код авторизации, чтобы получить токены обновления с моего сервера авторизации.
- Я не могу использовать Implicit Grant, потому что токены обновления не могут быть закрыты в браузере
Текущий подход заключается в обеспечении соблюдения политики MVC, требующей аутентифицированного пользователя. Но это может быть применено только к контроллеру MVC. Вот почему я добавил HomeController для обслуживания первого запроса.
См. Структуру проекта:
Мой 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 после того, как я был перенаправлен с сервера аутентификации?