Nuget Wif.Swt SwtSecurityTokenHandler — что мне добавить в заголовок аутентификации, чтобы пройти аутентификацию?

Запуск сайта MVC 4 в Azure с включенным WIF и использование dll Wif.SWT для использования токенов swt из acs.

<microsoft.identityModel>
<service saveBootstrapTokens="true">
  <audienceUris>
    <!--<add value="http://traffictheory.cloudapp.net/" />-->
    <add value="" />
  </audienceUris>
  <issuerNameRegistry type="Microsoft.IdentityModel.Swt.SwtIssuerNameRegistry, Wif.Swt">
    <trustedIssuers>
      <add thumbprint="033F53598E4ED92E51C07238E36BBFF4E67ABAD2" name="https://traffictheory.accesscontrol.windows.net/" />
    </trustedIssuers>
  </issuerNameRegistry>
  <claimsAuthenticationManager type="S_Innovations.TrafficTheory.Web.Security.TrafficTheoryClaimsAuthenticationManager, S-Innovations.TrafficTheory.Web.Security" />
  <federatedAuthentication>
    <cookieHandler requireSsl="false" />
    <wsFederation passiveRedirectEnabled="true" issuer="https://traffictheory.accesscontrol.windows.net/v2/wsfederation" realm="/" reply="/" requireHttps="false" />
  </federatedAuthentication>
  <certificateValidation certificateValidationMode="None" />
  <securityTokenHandlers>
        <add type="Microsoft.IdentityModel.Swt.SwtSecurityTokenHandler, Wif.Swt" />
    </securityTokenHandlers>
    <issuerTokenResolver type="Microsoft.IdentityModel.Swt.SwtIssuerTokenResolver, Wif.Swt" />
  <!--<serviceCertificate>
    <certificateReference findValue="‎417DE8DCA4326B845C189BDE0990673433435524" storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" />
  </serviceCertificate>-->    
</service>

The token that is returned to my client is from

var token = HttpContext.Current.User.BootstrapToken();

и это похоже на строку запроса, закодированную в html, из того, что я могу сказать, или на коллекцию значений имени.

Я пробовал: (клиент - это httpClient в приложении магазина Windows 8)

client.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue("Bearer", token);

client.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue("Bearer", System.Net.WebUtility.HtmlDecode(token));

Add("Authorization", string.Format("WRAP access_token=\"{0}\"", token))

и я из идей.

Сайт webapi не аутентифицирует запрос. FederatedAuthentication.WSFederationAuthenticationModule.AuthorizationFailed является триггером.

Вот что содержит токен.

http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fnameidentifier=HM81Sv2xnRD6P%2bm2W2T%2feBAfAhH2ZTMMxSBBOQ1Rxqs%3d&http%3a%2f%2fschemas.microsoft.com%2faccesscontrolservice%2f2010%2f07%2fclaims%2fidentityprovider=uri%3aWindowsLiveID&Audience=http%3a%2f%2f77.75.160.102%3a48451%2f&ExpiresOn=1348778300&Issuer=https%3a%2f%2ftraffictheory.accesscontrol.windows.net%2f&HMACSHA256=C7D9CvmEeGy1xHXFV3WqPn7L9Zm%2bwoXt8Z8IUf0tgmI%3d

и это то, что у меня есть у моего клиента:

http://77.55.160.102:48451/api/federation/end?acsToken=http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fnameidentifier=HM81Sv2xnRD6P%2bm2W2T%2feBAfAhH2ZTMMxSBBOQ1Rxqs%3d&http%3a%2f%2fschemas.microsoft.com%2faccesscontrolservice%2f2010%2f07%2fclaims%2fidentityprovider=uri%3aWindowsLiveID&Audience=http%3a%2f%2f77.75.160.102%3a48451%2f&ExpiresOn=1348787731&Issuer=https%3a%2f%2ftraffictheory.accesscontrol.windows.net%2f&HMACSHA256=xZT%2blbcV9WSPaJQ2XdEP5gkNJi6ZIp%2fxGveDAllXU7w%3d

это то, что ACS возвращает контроллеру mvc:

wa=wsignin1.0&wresult=%3Ct%3ARequestSecurityTokenResponse+xmlns%3At%3D%22http%3A%2F%2Fschemas.xmlsoap.org%2Fws%2F2005%2F02%2Ftrust%22%3E%3Ct%3ALifetime%3E%3Cwsu%3ACreated+xmlns%3Awsu%3D%22http%3A%2F%2Fdocs.oasis-open.org%2Fwss%2F2004%2F01%2Foasis-200401-wss-wssecurity-utility-1.0.xsd%22%3E2012-09-27T23%3A08%3A11.285Z%3C%2Fwsu%3ACreated%3E%3Cwsu%3AExpires+xmlns%3Awsu%3D%22http%3A%2F%2Fdocs.oasis-open.org%2Fwss%2F2004%2F01%2Foasis-200401-wss-wssecurity-utility-1.0.xsd%22%3E2012-09-27T23%3A18%3A11.285Z%3C%2Fwsu%3AExpires%3E%3C%2Ft%3ALifetime%3E%3Cwsp%3AAppliesTo+xmlns%3Awsp%3D%22http%3A%2F%2Fschemas.xmlsoap.org%2Fws%2F2004%2F09%2Fpolicy%22%3E%3CEndpointReference+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2005%2F08%2Faddressing%22%3E%3CAddress%3Ehttp%3A%2F%2F77.75.160.102%3A48451%2F%3C%2FAddress%3E%3C%2FEndpointReference%3E%3C%2Fwsp%3AAppliesTo%3E%3Ct%3ARequestedSecurityToken%3E%3Cwsse%3ABinarySecurityToken+wsu%3AId%3D%22uuid%3Acb218b5b-62df-47bc-85d4-0d765c13db39%22+ValueType%3D%22http%3A%2F%2Fschemas.xmlsoap.org%2Fws%2F2009%2F11%2Fswt-token-profile-1.0%22+EncodingType%3D%22http%3A%2F%2Fdocs.oasis-open.org%2Fwss%2F2004%2F01%2Foasis-200401-wss-soap-message-security-1.0%23Base64Binary%22+xmlns%3Awsu%3D%22http%3A%2F%2Fdocs.oasis-open.org%2Fwss%2F2004%2F01%2Foasis-200401-wss-wssecurity-utility-1.0.xsd%22+xmlns%3Awsse%3D%22http%3A%2F%2Fdocs.oasis-open.org%2Fwss%2F2004%2F01%2Foasis-200401-wss-wssecurity-secext-1.0.xsd%22%3EaHR0cCUzYSUyZiUyZnNjaGVtYXMueG1sc29hcC5vcmclMmZ3cyUyZjIwMDUlMmYwNSUyZmlkZW50aXR5JTJmY2xhaW1zJTJmbmFtZWlkZW50aWZpZXI9SE04MVN2MnhuUkQ2UCUyYm0yVzJUJTJmZUJBZkFoSDJaVE1NeFNCQk9RMVJ4cXMlM2QmaHR0cCUzYSUyZiUyZnNjaGVtYXMubWljcm9zb2Z0LmNvbSUyZmFjY2Vzc2NvbnRyb2xzZXJ2aWNlJTJmMjAxMCUyZjA3JTJmY2xhaW1zJTJmaWRlbnRpdHlwcm92aWRlcj11cmklM2FXaW5kb3dzTGl2ZUlEJkF1ZGllbmNlPWh0dHAlM2ElMmYlMmY3Ny43NS4xNjAuMTAyJTNhNDg0NTElMmYmRXhwaXJlc09uPTEzNDg3ODc4OTEmSXNzdWVyPWh0dHBzJTNhJTJmJTJmdHJhZmZpY3RoZW9yeS5hY2Nlc3Njb250cm9sLndpbmRvd3MubmV0JTJmJkhNQUNTSEEyNTY9OXB6Uk00UmxsSDZUU091dlNkYktpb0x2UjQzZlhIaTB6OWEzQVZ0dXNHcyUzZA%3D%3D%3C%2Fwsse%3ABinarySecurityToken%3E%3C%2Ft%3ARequestedSecurityToken%3E%3Ct%3ATokenType%3Ehttp%3A%2F%2Fschemas.xmlsoap.org%2Fws%2F2009%2F11%2Fswt-token-profile-1.0%3C%2Ft%3ATokenType%3E%3Ct%3ARequestType%3Ehttp%3A%2F%2Fschemas.xmlsoap.org%2Fws%2F2005%2F02%2Ftrust%2FIssue%3C%2Ft%3ARequestType%3E%3Ct%3AKeyType%3Ehttp%3A%2F%2Fschemas.xmlsoap.org%2Fws%2F2005%2F05%2Fidentity%2FNoProofKey%3C%2Ft%3AKeyType%3E%3C%2Ft%3ARequestSecurityTokenResponse%3E

Обновление решения Часть проверки подлинности токена simpel.

общедоступный статический класс WebApiConfig { public static void Register (конфигурация HttpConfiguration) { GlobalConfiguration.Configuration.MessageHandlers.Add (новый OAuthAuthenticationHandler ()); // GlobalConfiguration.Configuration.MessageHandlers.Add(new TokenValidationHandler());

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

}

    /// <summary>
    /// Authenticates the ongoing request using Windows Identity Foundation and 
    /// SimpleWebToken (wif.swf). Grabs the token from the header and performs the authentication.
    /// </summary>
public class OAuthAuthenticationHandler : MessageProcessingHandler
{
    ServiceConfiguration _serviceConfiguration;

    public ServiceConfiguration ServiceConfiguration
    {
        get
        {
            if (_serviceConfiguration == null)
                _serviceConfiguration = new ServiceConfiguration();

            if (!_serviceConfiguration.IsInitialized)
                _serviceConfiguration.Initialize();

            return _serviceConfiguration;
        }
    }

    protected override HttpRequestMessage ProcessRequest(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        try
        {
            var token = ExtractTokenFromHeader(request);

            if (token != null)
            {
                var identities = ServiceConfiguration.SecurityTokenHandlers.ValidateToken(token);
                var principal = ClaimsPrincipal.CreateFromIdentities(identities);

               // request.SetUserPrincipal(principal);
                Thread.CurrentPrincipal = principal;
                HttpContext.Current.User = principal;
            }
        }
        catch (InvalidSecurityTokenException)
        {
            throw new HttpException((int)System.Net.HttpStatusCode.Unauthorized, "The authorization header was invalid");
        }

        return request;
    }

    protected override HttpResponseMessage ProcessResponse(HttpResponseMessage response, CancellationToken cancellationToken)
    {
        return response;
    }

    static SimpleWebToken ExtractTokenFromHeader(HttpRequestMessage request)
    {
        var authorizationHeader = request.Headers.Authorization;

        if (authorizationHeader != null && authorizationHeader.Scheme == "OAuth")
            return new SimpleWebToken(authorizationHeader.Parameter);

        return null;
    }
}

person Poul K. Sørensen    schedule 27.09.2012    source источник
comment
В чем именно заключается ваш вопрос? Да, SWT — это формат токена, который будет выражен в виде строки запроса. Если вы хотите отправить это как заголовок, вы можете отправить его как часть заголовка авторизации как есть или в кодировке base64.   -  person woloski    schedule 28.09.2012
comment
О, я забыл последнюю часть своего вопроса, запрос заканчивается событием FederatedAuthentication.WSFederationAuthenticationModule.AuthorizationFailed, когда я пытаюсь получить доступ к webapi   -  person Poul K. Sørensen    schedule 28.09.2012
comment
Как выглядит ваш сценарий? У вас есть веб-приложение и веб-API. Вы настроили веб-сайт для использования ACS. Кто вызывает API?   -  person woloski    schedule 28.09.2012
comment
Я сделал сайт WebAPI, на нем есть как обычные, так и API-контроллеры. Он настроен с помощью ACS с токенами SWT. Аутентификация на сайте работает нормально. Теперь я делаю клиент Windows 8 Metro. Он использует брокера веб-аутентификации. Брокер запрашивает у ACS токен, который возвращается почтовому контроллеру на mysite/api/federation. Этот контроллер извлекает содержимое wresult и перенаправляет обратно на URL-адрес, который соответствует брокеру аутентификации. Итак, теперь у меня есть этот токен на моем клиенте. Проблема в том, что токен является загрузочной версией (последний пример в вопросе выше).   -  person Poul K. Sørensen    schedule 28.09.2012
comment
И мне нужно поместить токен в заголовки, когда клиент вызывает API на mysite/api.   -  person Poul K. Sørensen    schedule 28.09.2012
comment
Глядя на изменения, которые я только что сделал. Похоже, что загрузочный токен представляет собой ключ/значение без xml. Так что, может быть, мне нужно снова создать синтаксис xml на клиенте?   -  person Poul K. Sørensen    schedule 28.09.2012
comment
Может ли кто-нибудь сказать мне, где я могу найти учебник по этой теме? Я очень смущен.   -  person    schedule 10.09.2017


Ответы (1)


Пакет WIF SWT не обрабатывает запросы с заголовком Authorization, он просто настраивает обработчик SWT для использования с WSFederationAuthenticationModule, который понимает протокол WS-Federation. Протокол WS-Fed ожидает получить токен из параметра wresult HTTP POST. Этот wresult будет иметь XML, начинающийся с элемента <RequestSecurityTokenResponseCollection>. Внутри этого элемента вы найдете токен безопасности SWT, закодированный в base64. Обработчик токенов пакета NuGet декодирует его, проверяет и преобразует в файл ClaimsPrincipal. Вы также сможете получить доступ к этому токену с помощью метода BootstrapToken, как вы это делаете.

Сказал, что для веб-API вы должны обрабатывать аутентификацию с использованием модуля DelegatingHandler, а не модуля WSFederation, поскольку протоколы разные (POST и GET с заголовком).

Взгляните на это: https://github.com/wadewegner/ValidateACSTokenWebAPI/blob/master/WebAPI/TokenValidationHandler.cs

EDIT: исходный вопрос имеет альтернативную реализацию, но это примерно тот же подход.

person woloski    schedule 28.09.2012
comment
строка authHeader = request.Headers.GetValues(Authorization).First(); исключение: System.InvalidOperationException: данный заголовок не найден. - person Poul K. Sørensen; 28.09.2012
comment
Означает ли это, что к API нельзя получить доступ с помощью обычной аутентификации, если я добавлю это? или оба будут работать. - person Poul K. Sørensen; 28.09.2012
comment
вещи начинают работать. Обе аутентификации работают против API. Теперь одна проблема заключается в том, что загрузочный токен не имеет других утверждений, кроме идентификатора имени и поставщика. это означает, что я не могу [Авторизоваться (Roles=BLALABLA)] - person Poul K. Sørensen; 28.09.2012
comment
Если вы используете LiveID, вы получите только идентификатор имени, который является непрозрачным идентификатором, и ничего больше. Вы можете попробовать с Google, который дает вам адрес электронной почты пользователя. Но это может заслуживать отдельного вопроса. Пожалуйста, отметьте это как ответ, если вы считаете, что это помогло. - person woloski; 28.09.2012
comment
Я знаю, но я добавил роли и претензии при аутентификации самого себя. Они не включены в токен начальной загрузки. - person Poul K. Sørensen; 28.09.2012
comment
Как и где вы их добавили? В АКС? Вы жестко кодируете их? - person woloski; 28.09.2012
comment
Они добавляются в FederatedAuthentication.WSFederationAuthenticationModule для события SecurityTokenValidated. Когда контроллер возвращает загрузочный токен, я вижу утверждения в удостоверении, поэтому я знаю, что они есть. - person Poul K. Sørensen; 28.09.2012
comment
IClaimsIdentity clangIdentity = (IClaimsIdentity)claimsPrincipal.Identity; токен = ClaimsIdentity.BootstrapToken.ToString(); Вот как создается загрузочный токен. Так может быть, токен начальной загрузки сгенерирован раньше? - person Poul K. Sørensen; 28.09.2012
comment
Токен начальной загрузки является исходным токеном, так как он был размещен на вашем веб-сайте, и он не будет содержать утверждений, которые вы добавляете к этому событию. Если бы они были частью правил ACS, то они были бы у токена начальной загрузки. Если вы добавляете утверждения к этому токену, вы должны повторно подписать его, иначе нет смысла быть токеном безопасности. По сути, вы можете создать свою собственную версию токена с расширенными утверждениями и подписать его тем же симметричным ключом. - person woloski; 28.09.2012
comment
Обработчик токена имеет WriteToken, который позволит вам сделать это. В конечном действии вам придется повторно создать токен на основе токена начальной загрузки и вернуть этот новый токен. - person woloski; 28.09.2012
comment
Кстати, это должно было уйти в отдельный вопрос - person woloski; 28.09.2012
comment
Ладно, думаю, тогда я завершу это здесь. Я переместил его в stackoverflow.com/questions/12646216/, если вы хотите поделиться - person Poul K. Sørensen; 28.09.2012