Как подключить веб-приложение ASP.NET Core 6 MVC с помощью KeyCloakC#

Место общения программистов C#
Anonymous
Как подключить веб-приложение ASP.NET Core 6 MVC с помощью KeyCloak

Сообщение Anonymous »

Мне нужно использовать KeyCloak в качестве сервера SSO, чтобы авторизовать, во-первых, некоторые веб-приложения Mvc, а во-вторых, некоторые Apis.
Я нахожусь в тот момент, когда мне нужно настроить Keycloak для моего веб-приложения, поэтому мне удается найти эту ссылку:
введите описание ссылки здесь
но это не очень полезно.
У меня запущен образ докера Keycloak, Я создаю своего настоящего клиента и пользователя, так что для KeyCloak все выглядит нормально, по крайней мере, я так думаю.
Я создал базовое приложение ASP.NET Core MVC и обновил класс program.cs, чтобы настроить его в качестве примера в ссылке, поэтому:

Код: Выделить всё

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using System.IdentityModel.Tokens.Jwt;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

builder.Services.AddMvc();

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

builder.Services.AddAuthentication(options =>
{
// Store the session to cookies
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
// OpenId authentication
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie("Cookies")
.AddOpenIdConnect(options =>
{
// URL of the Keycloak server
options.Authority = "https://localhost:8080/auth/realms/BrunoRealm";
// Client configured in the Keycloak
options.ClientId = "MonApplication";

// For testing we disable https (should be true for production)
options.RequireHttpsMetadata = false;
options.SaveTokens = true;
options.ClientId = "MonApplication";
// Client secret shared with Keycloak
options.ClientSecret = "nrnsK6od01BpzJ0NTzvdC2DLt0ta72zp";
options.GetClaimsFromUserInfoEndpoint = true;

// OpenID flow to use
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
});

var app = builder.Build();

app.UseAuthentication();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

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

app.Run();
Я добавил атрибут [Authorize] в метод конфиденциальности домашнего контроллера, но когда я пытаюсь получить доступ к странице конфиденциальности, у меня возникает исключение, говорящее о SSL:

При обработке запроса произошло необработанное исключение.
IOException: невозможно определить размер кадра или был получен поврежденный кадр.

System.Net.Security.SslStream.GetFrameSize(буфер ReadOnlySpan)
HttpRequestException: не удалось установить SSL-соединение, см. внутреннее исключение.
System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, Запрос HttpRequestMessage, bool async, поток потока, CancellationToken cancelToken)
IOException: IDX20804: невозможно получить документ из: '[PII типа 'System.String' скрыт. Для получения более подробной информации см. https://aka.ms/IdentityModel/PII.]'.

Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(строковый адрес, отмену CancellationToken)
InvalidOperationException: IDX20803: невозможно получить конфигурацию из: '[PII типа «System.String» скрыт. Для получения более подробной информации см. https://aka.ms/IdentityModel/PII.]'.
Microsoft.IdentityModel.Protocols.ConfigurationManager.GetConfigurationAsync(CancellationToken cancel)
Маршрутизация заголовков файлов cookie запроса стека

IOException: невозможно определить размер кадра или получен поврежденный кадр.
System.Net.Security.SslStream.GetFrameSize(буфер ReadOnlySpan)

System.Net.Security.SslStream.ReceiveBlobAsync (адаптер TIOAdapter)

System.Threading.Tasks.ValueTask.get_Result()

System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable+ConfiguredValueTaskAwaiter.GetResult()

System.Net.Security.SslStream.ForceAuthenticationAsync(адаптер TIOAdapter, bool getFirst, byte[] reAuthenticationData, bool isApm)

System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, запрос HttpRequestMessage, bool async, поток потока, CancellationToken cancelToken)
Показать необработанные сведения об исключении

HttpRequestException: SSL-соединение не может быть установлено, см. внутреннюю информацию исключение.
System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, запрос HttpRequestMessage, bool async, поток потока, CancellationToken cancelToken)

System.Threading.Tasks.ValueTask.get_Result()

System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable+ConfiguredValueTaskAwaiter.GetResult()

System.Net.Http.HttpConnectionPool.ConnectAsync(запрос HttpRequestMessage, bool async, CancellationToken cancelToken)

System.Threading.Tasks.ValueTask.get_Result()

System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable+ConfiguredValueTaskAwaiter.GetResult()

System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage) request, bool async, CancellationToken cancelToken)

System.Threading.Tasks.ValueTask.get_Result()

System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable+ConfiguredValueTaskAwaiter.GetResult()

System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(запрос HttpRequestMessage)

System.Threading.Tasks.TaskCompletionSourceWithCancellation.WaitWithCancellationAsync(CancellationToken cancelToken)

System.Threading.Tasks.ValueTask.get_Result()

System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable+ConfiguredValueTaskAwaiter.GetResult()

System.Net.Http.HttpConnectionPool.GetHttp11ConnectionAsync(запрос HttpRequestMessage, bool async, CancellationToken cancelToken)

System.Threading.Tasks.ValueTask.get_Result()

System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable+ConfiguredValueTaskAwaiter.GetResult()

System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(запрос HttpRequestMessage, bool async, bool doRequestAuth, CancellationToken cancelToken)

System.Net.Http.DiagnosticsHandler.SendAsyncCore(запрос HttpRequestMessage, bool async, CancellationToken cancelToken)

System.Threading.Tasks.ValueTask.get_Result()

System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable+ConfiguredValueTaskAwaiter.GetResult()

System.Net.Http.RedirectHandler.SendAsync(запрос HttpRequestMessage, bool async, CancellationToken cancelToken)

System.Net.Http.HttpClient.

g__Core|83_0(запрос HttpRequestMessage, HttpCompletionOptioncompleteOption, CancellationTokenSource cts, bool DisposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)

Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(строковый адрес, CancellationToken cancel)
Показать необработанные сведения об исключении

IOException: IDX20804: Невозможно получить документ из: '[PII типа 'System.String' скрыт. Дополнительные сведения см. в https://aka.ms/IdentityModel/PII.]'.
Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(строковый адрес, отмену CancellationToken)

Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.GetAsync(строковый адрес, средство извлечения IDocumentRetriever, CancellationToken отменить)

Microsoft.IdentityModel.Protocols.ConfigurationManager.GetConfigurationAsync(CancellationToken отменить)
Показать необработанные сведения об исключении

InvalidOperationException: IDX20803: невозможно получить конфигурацию из: '[PII типа «System.String» скрыт. Дополнительные сведения см. в https://aka.ms/IdentityModel/PII.]'.

Microsoft.IdentityModel.Protocols.ConfigurationManager.GetConfigurationAsync(CancellationToken cancel)

Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.HandleChallengeAsyncInternal(свойства AuthenticationProperties)

Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.HandleChallengeAsync(свойства AuthenticationProperties)

Microsoft.AspNetCore.Authentication.AuthenticationHandler.ChallengeAsync(свойства AuthenticationProperties)

Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync (контекст HttpContext, строковая схема, свойства AuthenticationProperties)

Microsoft.AspNetCore.Authorization.Policy.AuthorizationMiddlewareResultHandler.HandleAsync(RequestDelegate next, контекст HttpContext, политика AuthorizationPolicy, PolicyAuthorizationResultauthorizeResult)

Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(контекст HttpContext)

Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Я понятия не имею, где искать. Должен ли я настроить SSL в своем образе докера. Должен ли я реализовать страницу входа в систему, но в этом случае как вызвать KeyCloak?
Итак, вкратце, что делать?

Вернуться в «C#»