#c# #asp.net-core #asp.net-web-api #.net-core #asp.net-core-webapi
Вопрос:
Этот вопрос уже задавался раньше, но прошло достаточно времени, и я чувствую, что его уместно задать снова, так как предыдущие ответы были .NET 2.
У меня есть недавняя установка программы установки и работы с ключами, обеспечивающая единый вход в систему с несколькими приложениями. Теперь по реальной причине был настроен маскировочный ключ, чтобы использовать его при разработке и доступе к веб-папкам. Я работаю над тем, чтобы отказаться от использования ADAL и MS ADFS на prem и перейти на MSAL и маскировку ключей.
Основываясь на предыдущих ответах, на стороне сервера я установил Microsoft.AspNetCore.Идентификация.Пакет OpenIdConnect NuGet (после отказа от попыток получить Microsoft.AspNetCore.Идентификация.JwtBearer для работы) и клиентская сторона пытались использовать MSAL. (Я не зациклился на этих технологиях, только на том, что я нашел до сих пор, если мне следует использовать что-то другое, пожалуйста, скажите об этом.)
Текущая попытка на стороне сервера: Внутри Startup.cs, внутри общедоступных служб конфигурации void(службы IServiceCollection)
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddOpenIdConnect(options =>
{
options.Authority = "https://keycloak.mydomain.net/auth/realms/myrealm/";
options.ClientId = "client_id";
options.ClientSecret = "client_secret";
options.RequireHttpsMetadata = true;
options.ResponseType = "code";
options.SaveTokens = true;
options.Scope.Add("openid");
options.Scope.Add("profile");
});
Текущая попытка на стороне клиента:
IPublicClientApplication app = PublicClientApplicationBuilder.Create(ClientID)
.WithRedirectUri(RedirectUri)
//.WithExtraQueryParameters(new Dictionary<string, string> { { "resource", HttpUtility.UrlEncode(RedirectUri) } })
.Build();
//IPublicClientApplication app = builder.Build();
IEnumerable<IAccount> accounts = await app.GetAccountsAsync();
//string[] scopes = new string[] { "openid", "profile", "allatclaims" };
string[] scopes = new string[] { "openid", "profile" }; //, "offline_access" };
Microsoft.Identity.Client.AuthenticationResult result = null;
try
{
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
//.WithExtraQueryParameters(new Dictionary<string, string> { { "resource", HttpUtility.UrlEncode(RedirectUri) } })
.ExecuteAsync();
}
catch (MsalUiRequiredException ex_a)
{
Debug.WriteLine("(1a) msal: " ex_a.Message ", code: " ex_a.ErrorCode);
try
{
result = await app.AcquireTokenInteractive(scopes)
//.WithExtraQueryParameters(new Dictionary<string, string> { { "resource", HttpUtility.UrlEncode(RedirectUri) } })
.ExecuteAsync();
}
catch (Exception e)
{
Debug.WriteLine("(1b) msal: " e.Message ", code: " e.HResult);
}
}
catch (Exception e)
{
Debug.WriteLine("(2) msal: " e.Message ", code: " e.HResult);
}
Ищу пример правильного способа сделать это или исправление для кода, который у меня сейчас есть.
Ошибка, которую я не смог преодолеть, — это AADSTS50049. Может ли быть так, что MSAL будет поддерживать только prem ms adfs и azure по дизайну?
Комментарии:
1. Возможно, я что-то упускаю, но я не понимаю, в чем заключается ваш настоящий вопрос?
2. Я ищу пример того, как это сделать, или помощь с кодом, который у меня сейчас есть.
3. для webapi, как правило, вы добавляете учетную запись службы, чтобы вы могли проходить аутентификацию без веб-интерфейса. Если это веб-сайт, просто перезванивающий через api, то нормальная аутентификация должна быть в порядке
4. В этом случае у меня есть мобильное приложение и настольное приложение, которые взаимодействуют с webapi и должны быть идентифицированы с помощью webapi. Дело в том, что у меня все это работало с prem adfs и ADAL, переход на .net core 5 означал, что мне нужно было переключиться на MSAL, но MSAL не работал с prem adfs (ошибка зарегистрирована и подтверждена ms), поэтому я установил keycloak и работаю над переключением на keycloak, не зная, как установить значения или какой пакет nuget я должен использовать. Не найти хорошего примера в сети. Лучшее, что я нашел, было с ним . чистая версия 2.