Использование нескольких провайдеров авторизации - Cook ie auth и Open ID connect - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь использовать несколько провайдеров аутентификации - очень простой повар ie аутентификация и открытый идентификатор соединения. Большинство моих пользователей будут использовать простой повар ie auth. Но несколько пользователей уже подключены к системе с открытым идентификатором, и я хочу, чтобы они могли подключиться. Я могу заставить один или другой из них работать, но не оба. Добавление openid connect отменяет другую систему cook ie. Как я могу заставить их играть хорошо друг с другом? Приемлемым решением было бы, если бы соединение Open ID не перенаправляло на экран входа в систему, и пользователям было бы необходимо go войти в систему вручную.

Вот мой класс запуска:

public class Startup
{
    public Startup(IConfiguration configuration) => this.Configuration = configuration;

    public IConfiguration Configuration { get; }

    private CultureInfo[] supportedCultures;
    private CultureInfo[] SupportedCultures => this.supportedCultures ??= new[] { new CultureInfo("en-US") };

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRouting(options =>
        {
            options.LowercaseUrls = true;
            options.AppendTrailingSlash = false;
            options.LowercaseQueryStrings = true;
        });

        // Add MVC with feature folders
        services.AddMvc(opt => opt.Filters
            .Add(typeof(DbContextTransactionFilter)))
            .AddFeatureFolders()
            .AddViewLocalization()
            .AddDataAnnotationsLocalization();

        // Add HTTP Context to DI Container
        services.AddHttpContextAccessor();

        // Add localization
        services.AddLocalization();
        services.Configure<RequestLocalizationOptions>(options =>
        {
            // Just supporting English right now
            options.DefaultRequestCulture = new RequestCulture("en-US", "en-US");

            // You must explicitly state which cultures your application supports.
            // These are the cultures the app supports for formatting 
            // numbers, dates, etc.
            options.SupportedCultures = this.SupportedCultures;

            // These are the cultures the app supports for UI strings, 
            // i.e. we have localized resources for.
            options.SupportedUICultures = this.SupportedCultures;
        });

        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddAuthentication(options =>
            {
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie(options =>
            {
                options.AccessDeniedPath = "/request-access";
                options.ExpireTimeSpan = TimeSpan.FromDays(14);
                options.LoginPath = "/request-access";
                options.LogoutPath = "/request-access";
                options.Cookie.Name = "AMGAuthCookie";
            })
            .AddOpenIdConnect("oidc", options =>
            {
                options.ClientId = "MyClientID";
                options.Authority = "https://myidentityserver.com/";
                options.RequireHttpsMetadata = false;
                options.GetClaimsFromUserInfoEndpoint = true;
                options.ResponseType = "code token";

                options.Scope.Clear();
                options.Scope.Add("openid");
                options.Scope.Add("sitecore.profile");
                options.Scope.Add("offline_access");
                options.Scope.Add("sitecore.profile.api");

                options.SaveTokens = true;

                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = JwtClaimTypes.Name,
                    RoleClaimType = JwtClaimTypes.Role,
                };
            }); 
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        var pageOptions = new DeveloperExceptionPageOptions { SourceCodeLineCount = 10 };
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage(pageOptions);
        }
        else
        {
            app.UseStatusCodePagesWithReExecute("/error/{0}");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        var cookiePolicyOptions = new CookiePolicyOptions
        {
            MinimumSameSitePolicy = SameSiteMode.Strict,
        };
        app.UseCookiePolicy(cookiePolicyOptions);

        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture("en-US"),
            SupportedCultures = this.SupportedCultures,
            SupportedUICultures = this.SupportedCultures
        });

        app.UseEndpoints(endpoints => endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}"));
    }
}

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Я решил эту проблему, оставив свой Startup.cs, как описано выше, но затем изменил способ авторизации своих контроллеров. Когда я авторизуюсь, я устанавливаю указанную c схему. Cook ie Схема заставляет меня войти в систему cook ie, OpenIdConnect Scheme заставляет меня войти в систему OpenIdConnect. Мне, вероятно, понадобится немного манипулировать ресурсами, когда я создаю приложение, но, похоже, это помогает. К счастью, существует бизнес-логика c разницы между пользователями, которые будут входить через cook ie против пользователей, которые будут входить через OpenIDConnect.

[Authorize(AuthenticationSchemes = OpenIdConnectDefaults.AuthenticationScheme)]
0 голосов
/ 04 апреля 2020

Используйте ForwardDefaultSelector, как описано здесь https://leastprivilege.com/2018/06/14/mixing-ui-and-api-endpoints-in-asp-net-core-2-1-aka-dynamic-scheme-selection/


       services
            .AddAuthentication(sharedOptions =>
            {
                sharedOptions.DefaultScheme = "dynamic";
            })
            .AddPolicyScheme("dynamic", "Cookie or JWT", options =>
            {
                options.ForwardDefaultSelector = context =>
                {
                    var authHeader = context.Request.Headers["Authorization"].FirstOrDefault();
                    var isApiPath = context.Request.Path.StartsWithSegments("/api");
                    if (authHeader?.StartsWith("Bearer ") || isApiPath)
                    {
                        return JwtBearerDefaults.AuthenticationScheme;
                    }
                    return CookieAuthenticationDefaults.AuthenticationScheme;
                };
            })
            .AddJwtBearer(o =>
            {
                o.Authority = Configuration["JWT:Authentication:Authority"];
                o.Audience = Configuration["JWT:Authentication:ClientId"];
                o.SaveToken = true;
            })
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme);

            ...

            }
...