Я пытаюсь интегрировать свое приложение 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.