Blazor аутентификация приложения на стороне сервера с двумя вариантами - PullRequest
0 голосов
/ 27 февраля 2020

Я довольно новичок в Blazor и изо всех сил пытаюсь реализовать функцию входа в систему, которая предлагает два варианта входа в систему. Приложение должно принимать пользователей моей компании, которые прошли проверку подлинности с помощью AzureAD, а также внешних пользователей, которые прошли проверку подлинности с помощью ASP Core Identity. Вход через Identity уже настроен. Для этого приложение использует логи по умолчанию c. Я также могу переключиться на аутентификацию AzureAD, которая прекрасно работает, когда я устанавливаю ее в качестве единственного поставщика.

По сути, я хочу закрыть все приложение, и все пользователи должны пройти аутентификацию для использования приложения. Они должны быть перенаправлены на страницу входа, где они выбирают способ входа.

Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<AppUser>(options =>
            {
                options.SignIn.RequireConfirmedAccount = true;
                options.User.RequireUniqueEmail = true;
            })
            .AddRoles<IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddRazorPages().AddRazorPagesOptions(options =>
        {
           options.Conventions.AuthorizeFolder("/");
        }).AddMvcOptions(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        }); ;
        services.AddServerSideBlazor();
        services.AddScoped<AuthenticationStateProvider, RevalidatingIdentityAuthenticationStateProvider<AppUser>>();

        services.AddScoped<ProjectService>();             
        services.AddScoped<AppUserService>();      

        services.AddTelerikBlazor();
        services.AddFileReaderService();
        services.AddTransient<IEmailSender, EmailSender>();
        services.AddScoped<UrlHelper>();

        services.AddAuthentication()
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));
    }

При использовании вышеуказанной версии Startup.cs пользователь правильно перенаправляется на / Identity /Логин аккаунта. Существует возможность входа через личность. Когда я пытаюсь

return Challenge(new AuthenticationProperties{RedirectUri = returnUrl},
                    AzureADDefaults.AuthenticationScheme);

, пользователь, направленный в AzureAD, может войти туда ... но затем возвращается на страницу входа, где пользователь все еще не авторизован.

Когда я изменяю Startup.cs от

services.AddAuthentication()
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));

до

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
                .AddAzureAD(options => Configuration.Bind("AzureAd", options));

, пользователь переходит непосредственно в AzureAD, проходит проверку подлинности там, а также в приложении. Больше не будет перенаправления на страницу входа.

Кто-нибудь знает, как я могу предложить обе опции аутентификации на своей странице входа и заставить пользователя перенаправляться туда?

Спасибо

...