2015-06-30 2 views
0

У меня есть существующее приложение 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. Существует множество вариантов обходных решений, но я хотел бы, чтобы кто-то авторитетно указал мне на правильно проверенное решение этой проблемы.

+0

привет, смогли ли вы решить эту проблему? У меня есть аналогичное приложение в веб-формах и все еще не удается найти какое-либо разрешение. благодаря –

ответ

0

Если вы хотите захватить трассировку скрипача, вы видите любой .AspNet.Cookies. Я подозреваю, что печенье не написано. Вы можете использовать распределенный кеш и удалять файлы cookie.

0

Я думаю, вам нужно включить промежуточное программное обеспечение аутентификации cookie, потому что вещь .AspNet.Cookies написана этим промежуточным программным обеспечением. Это, как вы можете интегрировать эту MiddleWare

app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

Примечание: Пожалуйста, убедитесь, что он должен быть на вершине OpenID Connect MiddleWare

для получения более подробной информации о CookieAuthenticationOptions пожалуйста зайдите по этой ссылке https://msdn.microsoft.com/en-us/library/microsoft.owin.security.cookies.cookieauthenticationoptions(v=vs.113).aspx.

Смежные вопросы