2013-07-12 4 views
3

У меня есть приложение, основанное на веб-API, которое в настоящее время настроено с использованием удивительной модели Thinktecture IdentityModel 4.5.Thinktecture IdentityModel AuthenticationConfiguration Mapping для Cookie - как?

Он настроен для проверки подлинности на основе утверждений, принимая базовые учетные данные аутентификации, отправленные в заголовок авторизации. Клиент javascript сохраняет возвращаемый токен сеанса и использует его для последующих запросов, включив его в заголовок авторизации, которому предшествует сеанс в качестве схемы.

Клиент javascript также сохраняет токен в файл cookie для поиска, если окно закрыто и быстро открывается, или когда открываются новые окна, чтобы пользователь не мог повторно аутентифицироваться. Файл cookie называется sessionToken, и его значение является фактическим токеном.

Все работает прекрасно.

Проблема заключается в том, что у меня есть ссылка на странице приложения, которая ссылается на прямой адрес (/ api/controller/id/pdfdocument) и открывает его в новом окне (цель: _blank). Поэтому нет способа включить заголовок авторизации в этот запрос. Однако cookie передается правильно, поскольку сеанс все еще активен.

Я попытался добавить сопоставление в коллекцию AuthenticationConfig.Mappings, чтобы добавить поддержку для сбора маркера из файла cookie, однако я просто не могу получить правильную конфигурацию, чтобы заставить это работать, и havn't был в состоянии найти любые другие ресурсы в Интернете. Я предполагаю, что есть что-то очень простое, что нужно исправлять.

Мой код:

private static AuthenticationConfiguration CreateAuthenticationConfiguration() 
    { 
     var sessionTokenConfiguration = new SessionTokenConfiguration(); 
     sessionTokenConfiguration.EndpointAddress = "/Authenticate"; 
     sessionTokenConfiguration.DefaultTokenLifetime = new TimeSpan(1, 0, 0); 

     var authenticationConfig = new AuthenticationConfiguration 
     { 
      ClaimsAuthenticationManager = _authenticationManager, 
      RequireSsl = false, 
      EnableSessionToken = true, 
      SessionToken = sessionTokenConfiguration, 
      SendWwwAuthenticateResponseHeaders = false 
     }; 

     var securityTokenHandler = new Thinktecture.IdentityModel.Tokens.Http.BasicAuthenticationWithRoleSecurityTokenHandler(_userService.ValidateUser, _userService.GetRolesForUser); 
     securityTokenHandler.RetainPassword = false; 
     var realm = "localhost"; 

     var authorizationMapping = new AuthenticationOptionMapping 
     { 
      Options = AuthenticationOptions.ForAuthorizationHeader(scheme: "Basic"), 
      TokenHandler = new System.IdentityModel.Tokens.SecurityTokenHandlerCollection { securityTokenHandler }, 
      Scheme = AuthenticationScheme.SchemeAndRealm("Basic", realm) 
     }; 
     authenticationConfig.AddMapping(authorizationMapping); 

     var cookieMapping = new AuthenticationOptionMapping 
     { 
      Options = AuthenticationOptions.ForCookie("sessionToken"), 
      TokenHandler = new System.IdentityModel.Tokens.SecurityTokenHandlerCollection { securityTokenHandler }, 
      Scheme = AuthenticationScheme.SchemeOnly(scheme: "Session") 
     }; 
     authenticationConfig.AddMapping(cookieMapping); 

     //authenticationConfig.AddBasicAuthentication(_userService.ValidateUser, _userService.GetRolesForUser); 

     return authenticationConfig; 
    } 

Эта конфигурация затем применяется следующим образом:

HttpConfiguration config; 
var authenticationConfig = CreateAuthenticationConfiguration(); 
config.MessageHandlers.Add(new AuthenticationHandler(authenticationConfig)); 

И это то, что печенье выглядит в заголовке запроса:

Cookie: sessionToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjEzNzM2NDA5NjgsImlzcyI6InNlc3Npb24gaXNzdWVyIiwiYXVkIjoiaHR0cDovL3Nlc3Npb24udHQvIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6ImEiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL2F1dGhlbnRpY2F0aW9ubWV0aG9kIjoiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2F1dGhlbnRpY2F0aW9ubWV0aG9kL3Bhc3N3b3JkIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9hdXRoZW50aWNhdGlvbmluc3RhbnQiOiIyMDEzLTA3LTEyVDEzOjU2OjA4LjA5N1oiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJBZG1pbmlzdHJhdG9yIiwiSWQiOiIyIn0.UlPeD9HzduQfwHE7NuXi9eMVo40hypi_LBK-f76VYFI; username=a 

Любой Помогите!

+0

Ibraheem, если вам посчастливилось прочитать этот комментарий, я думаю, вы можете мне помочь с этим вопросом http://stackoverflow.com/questions/27731539 –

ответ

2

Итак, после ожидания нескольких минут и не получая ответов и отчаянно нуждающихся в этой функции, я погрузился в исходный код Thinktecture IdentityModel 4.5, чтобы увидеть, что происходит, и кажется, что эта функция фактически не поддерживается. Мало того, что он не поддерживается, но из-за внешнего вида его отображение cookie фактически не реализовано.

Я раздвоенный репозиторий и сделал несколько небольших изменений, чтобы позволить для этой функции: https://github.com/ibraheemhlaiyil/Thinktecture.IdentityModel.45

и послал Доминик Байер из Thinktecture этого в запросе тяговой: https://github.com/thinktecture/Thinktecture.IdentityModel.45/pull/95

использование Cookie имеет это недостатки, и кажется, что Thinktecture стараются держаться подальше от них, насколько это возможно, однако я не мог придумать другое решение моей проблемы - веб-приложения клиента javascript, которым нужно открыть новое окно/вкладку и поддерживать аутентифицированный сеанс в новое окно/вкладка.

Если вы хотите использовать эту функцию, вы просто установите новое свойство CookieName на объект SessionTokenConfiguration. IdentityModel использует свойство HeaderName, чтобы определить, какой заголовок ищет данные аутентификации.Таким же образом, если установлено свойство CookieName, это определяет, какое имя cookie будет искать данные аутентификации, если в заголовке не было обнаружено данных аутентификации.

В приведенном ниже примере, данные аутентификации ищется на печенье по имени sessionToken если данные аутентификации не найден на авторизации заголовка.

private static AuthenticationConfiguration CreateAuthenticationConfiguration() 
    { 

     var authenticationConfig = new AuthenticationConfiguration 
     { 
      ClaimsAuthenticationManager = _authenticationManager, 
      RequireSsl = false, 
      SendWwwAuthenticateResponseHeaders = false, 
      EnableSessionToken = true, 
      SessionToken = new SessionTokenConfiguration 
      { 
       EndpointAddress = "/Authenticate", 
       DefaultTokenLifetime = new TimeSpan(1, 0, 0), 
       HeaderName = "Authorization", 
       CookieName = "sessionToken", 
       SigningKey = CryptoRandom.CreateRandomKey(32) 
      } 
     }; 

     authenticationConfig.AddBasicAuthentication(_userService.ValidateUser, _userService.GetRolesForUser); 

     return authenticationConfig; 
    } 

Как и прежде, эта конфигурация применяется как и во время вашего приложения запуска: данные аутентификации

HttpConfiguration config; 
var authenticationConfig = CreateAuthenticationConfiguration(); 
config.MessageHandlers.Add(new AuthenticationHandler(authenticationConfig)); 

Куки имеет точно такой же вид, как и данные, отправляемые в заголовке Authorization, поэтому при отправке , cookie должен выглядеть так:

Cookie: sessionToken=Session eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjEzNzM2NDA5NjgsImlzcyI6InNlc3Npb24gaXNzdWVyIiwiYXVkIjoiaHR0cDovL3Nlc3Npb24udHQvIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6ImEiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL2F1dGhlbnRpY2F0aW9ubWV0aG9kIjoiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2F1dGhlbnRpY2F0aW9ubWV0aG9kL3Bhc3N3b3JkIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9hdXRoZW50aWNhdGlvbmluc3RhbnQiOiIyMDEzLTA3LTEyVDEzOjU2OjA4LjA5N1oiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJBZG1pbmlzdHJhdG9yIiwiSWQiOiIyIn0.UlPeD9HzduQfwHE7NuXi9eMVo40hypi_LBK-f76VYFI 

Надеюсь, что кто-то найдет это для использования!