Как использовать IdentityServer для аутентификации и AspNetIdentity проекта? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть несколько клиентских приложений и приложение сервера идентификации. Каждое приложение должно иметь поток единого входа в него. До сих пор я был в состоянии зарегистрировать мои другие приложения без каких-либо проблем. Тем не менее, я столкнулся с проблемой бесконечного цикла для моего приложения идентификации. Я думаю, что каким-то образом часть 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

enter image description here

http://localhost:59990/Identity/Account/Register enter image description here

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 кодированный текст) enter image description here

1 Ответ

1 голос
/ 22 мая 2019

Когда вы звоните AddIdentity<>, вы уже настраиваете аутентификацию с несколькими вариантами. Поэтому попробуйте переопределить все три значения по умолчанию:

services.AddAuthentication(sharedOptions =>
{
  sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  sharedOptions.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})

как описано в образце

...