У меня есть несколько клиентских приложений и приложение сервера идентификации. Каждое приложение должно иметь поток единого входа в него. До сих пор я был в состоянии зарегистрировать мои другие приложения без каких-либо проблем. Тем не менее, я столкнулся с проблемой бесконечного цикла для моего приложения идентификации. Я думаю, что каким-то образом часть AddIdentity()
моего приложения идентификации сталкивается с регистрацией клиента IdentityServer4 в вызове метода AddAuthentication()
.
Единственная обязанность проблемного приложения - управлять пользователями, которые принадлежат всем приложениям, но не регистрировать их в действительности (вход выполняется с помощью IdentityServer4). Вот конфигурации.
// Config.cs - problem client configuration
new Client
{
ClientId = "identity",
ClientName = "Identity Management",
AllowedGrantTypes = GrantTypes.Implicit,
RedirectUris = { "http://localhost:59990/signin-oidc" },
PostLogoutRedirectUris = { "http://localhost:59990/signout-callback-oidc" },
AllowedScopes = GetAllowedScopes(),
},
Я не думаю, что в config.cs что-то не так, поскольку все мои приложения до этого могут входить в систему с использованием одного и того же регистрационного кода клиента.
// ConfigureServices.cs - for client that has redirect loop
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddDbContext<SafetyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SafetyPlusConnection")));
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddIdentity<SafetyUser, SafetyRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddRoleManager<RoleManager<SafetyRole>>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ClientId = "identity";
options.SaveTokens = true;
});
services.AddScoped<RoleService>();
Оставшаяся конфигурация - это просто некоторый шаблонный код.
// Configure.cs - in the problem application
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
// Register.cs - code for registering new users (needs authorization first)
[Authorize]
public class RegisterModel : PageModel
Когда я перехожу на свою страницу регистрации, которая украшена атрибутом [Authorize]
, я правильно вошел в IdentityServer и запросил доступ к моим привилегиям openid и профиля. Когда я принимаю запрос, приложение запускает бесконечный цикл.
Эти три следующих запроса повторяются в бесконечном цикле.
http://localhost:59990/signin-oidc
http://localhost:59990/Identity/Account/Register
http://localhost:5000/connect/authorize?client_id=identity&redirect_uri=http%3A%2F%2Flocalhost%3A59990%2Fsignin-oidc&response_type=id_token&scope=openid%20profile&response_mode=form_post&nonce=...(elided кодированный текст)