Ищу комментарии к моему коду в надежде найти практику, основанную на стандартах. В настоящее время я развертываю приложение SPA (угловое) с .NET Core в качестве бэкэнда. У нас есть предварительная ADFS, поэтому я настроил приложение для автоматического входа пользователей, когда они попадают на сайт. Код работает нормально, однако мне любопытно, является ли это обычным способом выполнения или если есть стандартный шаблон для этого варианта использования.
using CPQrp.Services;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.WsFederation;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SpaServices.AngularCli;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Linq;
namespace CPQrp
{
public class Startup
{
private IConfiguration _config;
public Startup(IConfiguration configuration)
{
_config = configuration;
}
/// <summary>
/// This method gets called by the runtime. Use this method to add services to the container.
/// </summary>
/// <param name="services"></param>
public void ConfigureServices(IServiceCollection services)
{
// ROUTING
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSpaStaticFiles(configuration =>
{
// In production, the Angular files will be served from this directory
configuration.RootPath = "ClientApp/dist";
});
// CUSTOM SERVICES
services.AddSingleton<IApplicationUser, ApplicationUser>();
// AUTHENTICATION
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
})
.AddWsFederation(options =>
{
_config.Bind("ADFS", options);
})
.AddCookie(options =>
{
options.Cookie.Name = "auth";
options.Cookie.Expiration = TimeSpan.FromDays(30);
});
}
/// <summary>
///
/// </summary>
/// <param name="app"></param>
/// <param name="env"></param>
/// <param name="appUser"></param>
/// <param name="logger"></param>
public void Configure(IApplicationBuilder app,
IHostingEnvironment env,
IApplicationUser appUser,
ILogger<Startup> logger)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.Use(next =>
{
return async context =>
{
// DefaultAuthenticateScheme causes User to be set
var user = context.User;
// Not authenticated
if (user == null || !user.Identities.Any(identity => identity.IsAuthenticated))
{
await context.ChallengeAsync();
}
else
{
if (!appUser.Exists())
appUser.LoadUserData(context);
await next(context);
}
};
});
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
}
}
}