У меня есть существующее приложение MVC5. Я конвертирую с использования AspNetIdentity для использования ThinkTecture Identity Server 3 v2. Поставщик OpenID не является самой большой проблемой, с которой я сталкиваюсь, поскольку он работает отлично. Маркер безопасности проверяется, и я обработка уведомления SecurityTokenValidated в методе, чтобы получить дополнительные требования Информации о пользователе и добавить специфическую для данной системы требований разрешения на набор претензий, похожие на код ниже:OWIN OpenID Connect Middleware не заменяет текущего пользователя с ClaimsPrincipal
Owin Middleware
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "https://localhost:44300/identity",
Caption = "My Application",
ClientId = "implicitclient",
ClientSecret = Convert.ToBase64String(SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes("secret"))),
RedirectUri = "http://localhost:8080/",
ResponseType = "id_token token",
Scope = "openid profile email roles",
SignInAsAuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
UseTokenLifetime = false,
Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = ClaimsTransformer.GenerateUserIdentityAsync
}
});
Иски Трансформатор
public static async Task GenerateUserIdentityAsync(SecurityTokenValidatedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification)
{
var identityUser = new ClaimsIdentity(
notification.AuthenticationTicket.Identity.Claims,
notification.AuthenticationTicket.Identity.AuthenticationType,
ClaimTypes.Name,
ClaimTypes.Role);
var userInfoClient = new UserInfoClient(new Uri(notification.Options.Authority + "/connect/userinfo"),
notification.ProtocolMessage.AccessToken);
var userInfo = await userInfoClient.GetAsync();
identityUser.AddClaims(userInfo.Claims.Select(t => new Claim(t.Item1, t.Item2)));
var userName = identityUser.FindFirst("preferred_username").Value;
var user = MembershipProxy.GetUser(userName);
var userId = user.PersonID;
identityUser.AddClaim(new Claim(ClaimTypes.Name, userId.ToString(), ClaimValueTypes.Integer));
// Populate additional claims
notification.AuthenticationTicket = new AuthenticationTicket(identityUser, notification.AuthenticationTicket.Properties);
}
проблема заключается в том, что ClaimsIdentity назначен Authentica в конце трансформатора никогда не заселяется в конвейере System.Web. Когда запрос поступает к моему контроллеру во время OnAuthenticationChallenge, я проверяю свойство User, чтобы найти анонимный WindowsPrincipal с аналогичным экземпляром WindowsIdentity, назначенным для свойства Identity, как если бы атрибут веб-конфигурации system.web/authentication/@mode
был установлен на None (по крайней мере, я считаю, что это поведение для этого режима).
Что может вызвать сбой промежуточного программного обеспечения для установки принципала для пользователя или его замену во время обработки System.Web анонимным идентификатором Windows? Я не смог отследить это.
EDIT: Это происходит независимо от того, обрабатывается ли уведомление SecurityTokenValidated и требования дополняются.
EDIT 2: Причина заключается в использовании сервера состояния сеанса государственной службы ASP.NET в моем web.config с помощью файлов cookie. Запись конфигурации:
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" timeout="30" cookieless="UseCookies" />
Это выглядит, связанно с сообщенной проблемой в Microsoft.Owin.Host.SystemWeb #197, где печенье не сохранялось из контекста запроса Owin в трубопровод System.Web. Существует множество вариантов обходных решений, но я хотел бы, чтобы кто-то авторитетно указал мне на правильно проверенное решение этой проблемы.
привет, смогли ли вы решить эту проблему? У меня есть аналогичное приложение в веб-формах и все еще не удается найти какое-либо разрешение. благодаря –