Автоматический вход в .NET Core с помощью ADFS - PullRequest
0 голосов
/ 19 ноября 2018

Ищу комментарии к моему коду в надежде найти практику, основанную на стандартах. В настоящее время я развертываю приложение 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");
            }
        });
    }
}
}
...