ПРОБЛЕМА
У меня проблема с использованием OpenID Connect 3 для предоставления авторизации для веб-сайта, который я разрабатываю.
Проблема выглядит так:
- Я захожу на защищенную страницу и перенаправляюсь на IdentityServer (OpenID Connect 3)
- Сервер идентификации запрашивает мое имя пользователя и пароль
- Эти учетные данные считаются нормальными, и я затем перенаправлен обратно на сайт MVC.
- Это то, что идет не так. По какой-то причине сайт остается не прошедшим проверку подлинности и перенаправляет его обратно на Identityserver.
- Что касается сервера идентификации, я уже вошел в систему, поэтому он перенаправляет меня обратно в приложение mvc
Шаги 4 и 5 продолжаются вечно ... Что ж, они могли бы, если бы не было достигнуто ограничение максимального количества файлов cookie, которое завершает все.
ПРОБНЫЕ РЕШЕНИЯ
После нескольких дней поиска в Google я попробовал следующее, но пока у меня ничего не работает.
Исправление Cookie Kentor Owin в классе запуска. Функция ConfigureAuth
app.UseKentorOwinCookieSaver();
Вариация 1
app.UseKentorOwinCookieSaver(PipelineStage.Authenticate);
Альтернативный менеджер файлов cookie SystemWebCookieManager
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies",
CookieManager = new SystemWebCookieManager()
});
Вариант 3 SystemWebChunkingCookieManager
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies",
CookieManager = new SystemWebChunkingCookieManager()
});
Заглушки сессий в файле Global.asa
protected void Session_Start()
{
}
protected void Session_End()
{
}
Я попробовал несколько других вещей, где другой разработчик написал собственный код, чтобы попытаться исправить. Я немного схожу с ума, потому что, кажется, ничего не работает. Кто-нибудь еще был здесь, чтобы дать мне подсказку, что я могу делать дальше? Ниже приведен соответствующий код из моего приложения OpenIdServer и MVC.
Конфигурация Identity Server
using Microsoft.Owin;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using IDServer.Config;
using IdentityServer3.Core.Configuration;
using System.Security.Cryptography.X509Certificates;
[assembly: OwinStartup(typeof(IDServer.Startup))]
namespace IDServer
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Map("", idsrvApp =>
{
idsrvApp.UseIdentityServer(new IdentityServer3.Core.Configuration.IdentityServerOptions
{
SiteName = "Identity Server",
IssuerUri = "https://localhost:44398/embedded",
Factory = new IdentityServerServiceFactory()
.UseInMemoryClients(Clients.Get())
.UseInMemoryScopes(Scopes.Get())
.UseInMemoryUsers(Users.Get()),
SigningCertificate = LoadCertificate(),
RequireSsl = true,
});
});
}
X509Certificate2 LoadCertificate()
{
return new X509Certificate2(
string.Format(@"{0}\Certificates\idsrv3test.pfx",
AppDomain.CurrentDomain.BaseDirectory), "idsrv3test");
}
}
}
Конфигурация регистрации клиента на сервере
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using IdentityServer3.Core.Models;
namespace IDServer.Config
{
public static class Clients
{
public static IEnumerable<Client> Get()
{
return new[]
{
new Client
{
Enabled=true,
ClientName = "My Application",
ClientId = "MyApp",
Flow = Flows.Hybrid,
//Flow=Flows.Implicit,
RequireConsent = true,
RedirectUris = new List<string> { "https://localhost:44362/" },
AllowedScopes = new List<string> {"openid"}
}
};
}
}
}
Web App Config
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.OpenIdConnect;
using Owin;
using System;
using System.Diagnostics;
using System.Web;
using Microsoft.Owin.Host.SystemWeb;
using Microsoft.Owin.Infrastructure;
[assembly: OwinStartup(typeof(MyApp.Startup))]
namespace MyApp {
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.UseKentorOwinCookieSaver();
//app.UseKentorOwinCookieSaver(PipelineStage.Authenticate);
app.SetDefaultSignInAsAuthenticationTypeCookieAuthenticationDefaults
.AuthenticationType);
ICookieManager c = new SystemWebCookieManager();
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies",
//CookieManager = new SystemWebChunkingCookieManager()
//CookieManager = new SystemWebCookieManager()
CookieManager = c
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = "MyApp",
Authority = "https://localhost:44398/",
RedirectUri = "https://localhost:44362/",
SignInAsAuthenticationType = "Cookies",
ResponseType = "code id_token",
Scope = "openid",
RequireHttpsMetadata = true,
CallbackPath = new PathString("/home/contact/"),
Notifications = new OpenIdConnectAuthenticationNotifications()
{
MessageReceived = async n =>
{
Debug.Print(n.ProtocolMessage.IdToken);
}
}
}
}