Серверная часть Blazor с Okta не запускается - Форумы Devta Devol не имеют ответа через неделю - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь интегрировать свое приложение Blazor с Okta, что я ранее делал с использованием инфраструктуры React SPA и их документации. Когда я пытался это сделать, я столкнулся с проблемой как в своем собственном приложении, так и в пошаговых инструкциях по умолчанию, которые я нашел здесь: Руководство по установке Okta Blazer Аналогично, написанный мной код может быть найдено в этом репозитории github: Приложение Blazor Okta Вот моя ошибка, которая, как мне кажется, связана с OID C:

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware 1 Произошло необработанное исключение при выполнении запроса. System.InvalidOperationException: Предоставьте Authority, MetadataAddress, Configuration или ConfigurationManager для OpenIdConnectOptions в Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectOptions.Validate () в Microsoft.AspNetCore.Authentication.RemoteAutheate. AuthenticationBuilder. <> C__DisplayClass4_0 2.<AddSchemeHelper>b__1(TOptions o) at Microsoft.Extensions.Options.ValidateOptions 1.Validate (имя строки, параметры TOptions) в Microsoft.Extensions.Options.OptionsFactory 1.Create(String name) at Microsoft.Extensions.Options.OptionsMonitor 1. <> C__DisplayClass11_0.b__0 () в System.Lazy 1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy 1.ExecutionAndPublic executeAndPublication, логическое значение useDefaultConstructor) в System.Lazy 1.CreateValue() at System.Lazy 1.get_Value () в Microsoft.Extensions.Options.OptionsCache 1.GetOrAdd(String name, Func 1 createOptions) в Microsoft.Extensions.Options.OptionsMonitor 1.Get(String name) at Microsoft.AspNetCore.Authentication.AuthenticationHandler 1.InitializeAsyn c (AuthenticationScheme схема, контекст HttpContext) в Microsoft.AspNetCore.Authentication.AuthenticationHandlerProvider.GetHandlerAsyn c (контекст HttpContext, String authenticationScheme) в Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (контекст HttpContext) в Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)

Шаги, которые я предпринял, чтобы получить здесь, были: * 1019 1020 *

Создайте новый шаблон из этой команды: dotnet new blazorserver -o OktaBlazorAspNetCoreServerSide запустите шаблон через dotnet run, чтобы убедиться, что шаблон работает (успех) Добавьте okta SDK через cli: dotnet add package Okta.Sdk --version 1.4.0 Добавить OID C через cli: dotnet add package Microsoft.AspNetCore.Authentication.OpenIdConnect --version 3.0.0

Добавить новое приложение okta (веб) Новые настройки веб-приложения

Добавить мой экземпляр okta в мои appsettings. json файл (это нормально, так как это просто одноразовый ключ / секрет приложений):

"Okta": {" ClientId ":" 0oa3p68xyxNszKiXt357 "," ClientSecret ":" ghZtcNIaKK6AFlEuPmXox2miaOQT2PErGqbkLXne "," OktaDomain ":" https://dev-715227.okta.com/oauth2/default "}

* * * * * *1046* * * * * * * * * * * * * * * * * * * * * * включите необходимые использования, настройте службы и авторизацию:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using OktaBlazorAspNetCoreServerSide.Data;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.IdentityModel.Logging;
namespace OktaBlazorAspNetCoreServerSide
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddSingleton<WeatherForecastService>();

            services.AddAuthentication(sharedOptions =>
            {
                sharedOptions.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                sharedOptions.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
            .AddOpenIdConnect(options =>
            {
                options.ClientId = Configuration["Okta:ClientId"];
                options.ClientSecret = Configuration["Okta:ClientSecret"];
                options.CallbackPath = "/authorization-code/callback";
                options.Authority = Configuration["Okta:Issuer"];
                options.ResponseType = "code";
                options.SaveTokens = true;
                options.Scope.Add("openid");
                options.Scope.Add("profile");
                options.TokenValidationParameters.ValidateIssuer = false;
                options.TokenValidationParameters.NameClaimType = "name";
            })
            .AddCookie();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // 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();
            //Add Auth to app
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                //Add MapControllers to app
                endpoints.MapControllers();
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });
        }
    }
}
Добавьте контроллер входа в систему:
        using Microsoft.AspNetCore.Mvc;
        using System.Threading.Tasks;

      namespace BlazorServerWithOkta.Controllers
    {


     public class LoginController : Controller
             {
                 [HttpGet("Login")]
            public IActionResult Login([FromQuery]string returnUrl)
            {
                if (User.Identity.IsAuthenticated)
                {
                     return LocalRedirect(returnUrl ?? Url.Content("~/"));
                }
     return Challenge();
            }

            [HttpGet("Logout")]
            public async Task<IActionResult> Logout([FromQuery]string returnUrl)
            {
                if (!User.Identity.IsAuthenticated)
                {
                    return LocalRedirect(returnUrl ?? Url.Content("~/"));
                }

                await HttpContext.SignOutAsync();

                return LocalRedirect(returnUrl ?? Url.Content("~/"));
            }

            [HttpPost("Logout")]
            [ValidateAntiForgeryToken]
            public IActionResult PostLogout([FromQuery]string returnUrl)
            {
                returnUrl ??= Url.Content("~/");
                returnUrl = Url.IsLocalUrl(returnUrl) ? returnUrl : Url.Content("~/");

                if (User.Identity.IsAuthenticated)
                {
                    HttpContext.SignOutAsync();
                }

                return LocalRedirect(returnUrl);
            }

        }
    }

Добавить компонент бритвы для входа в систему:

Здравствуйте, @ context.User.Identity.Name! Выйти Войти

Добавьте компонент в MainLayout:
    <LoginDisplay />
    <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>```


11. Replace the App.razor code with Okta's code: 

```<CascadingValue Name="AccessToken" Value="AccessToken">
    <CascadingAuthenticationState>
        <Router AppAssembly="@typeof(Program).Assembly">
            <Found Context="routeData">
                <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
            </Found>
            <NotFound>
                <LayoutView Layout="@typeof(MainLayout)">
                    <p>Sorry, there's nothing at this address.</p>
                </LayoutView>
            </NotFound>
        </Router>
    </CascadingAuthenticationState>
</CascadingValue>
@code{
    [Parameter] public string AccessToken { get; set; }
}```


12. Attempt to run app and see error: 
> Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
  An unhandled exception has occurred while executing the request.
System.InvalidOperationException: Provide Authority, MetadataAddress, Configuration, or ConfigurationManager to OpenIdConnectOptions
at Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectOptions.Validate()
at Microsoft.AspNetCore.Authentication.RemoteAuthenticationOptions.Validate(String scheme)
at Microsoft.AspNetCore.Authentication.AuthenticationBuilder.<>c__DisplayClass4_0`2.<AddSchemeHelper>b__1(TOptions o)
at Microsoft.Extensions.Options.ValidateOptions`1.Validate(String name, TOptions options)
at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
at Microsoft.Extensions.Options.OptionsMonitor`1.<>c__DisplayClass11_0.<Get>b__0()
at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
at System.Lazy`1.CreateValue()
at System.Lazy`1.get_Value()
at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions)
at Microsoft.Extensions.Options.OptionsMonitor`1.Get(String name)
at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.InitializeAsync(AuthenticationScheme scheme, HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationHandlerProvider.GetHandlerAsync(HttpContext context, String authenticationScheme)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Насколько я могу судить, как было сказано ранее, это похоже на ошибку с OID C. Я попытался исправить проблему, добавив полномочия в файле startup.cs (options.Authority = Configuration ["Okta: Issuer"];) или подписавшись на других пользователей, у которых возникла ошибка. Кажется, я не могу заставить это работать, и Okta совершенно молчала по моей проблеме, когда я разместила ее на форумах разработчиков Dev. Кто-нибудь может направить меня в этом? Я предполагаю, что это мое отсутствие знаний о ASP. NET и OID C.

...