2015-10-26 2 views
1

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

private static SecurityToken RequestSamlToken() 
      { 
       var factory = new WSTrustChannelFactory(
        new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
        new EndpointAddress(adfsEndpoint)); 
       factory.TrustVersion = TrustVersion.WSTrust13; 
       factory.Credentials.UserName.UserName = username; 
       factory.Credentials.UserName.Password = password; 

       var rst = new RequestSecurityToken 
       { 
        RequestType = RequestTypes.Issue, 
        KeyType = KeyTypes.Bearer, 
        AppliesTo = new EndpointReference(realm) 
       }; 

       return factory.CreateChannel().Issue(rst); 
      } 

Я получаю следующее сообщение об ошибке:

Необработанное исключение типа «System.ServiceModel.FaultException» произошло в System.ServiceModel.dll Дополнительная информация: ID3082 : Область запроса недействительна или не поддерживается.

Существует ли какая-либо конфигурация на сервере ADFS, которая запрещает использование токенов? Другой фрагмент кода, который использует IdpInitiated Logon, работает для генерации маркера SAML. от свойств ADFS являются следующим образом-

AcceptableIdentifiers      : {} 
AddProxyAuthorizationRules     : exists([Type == 
              "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid", Value 
              == "S-1-5-32-544", Issuer =~ "^AD AUTHORITY$"]) => issue(Type = 
              "http://schemas.microsoft.com/authorization/claims/permit", Value = 
              "true"); 
                 c:[Type == 
              "http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid", 
              Issuer =~ "^AD AUTHORITY$" ] 
                    => issue(store="_ProxyCredentialStore",types=("http 
              ://schemas.microsoft.com/authorization/claims/permit"),query="isProxyTrust 
              ManagerSid({0})", param=c.Value); 
                 c:[Type == 
              "http://schemas.microsoft.com/ws/2008/06/identity/claims/proxytrustid", 
              Issuer =~ "^SELF AUTHORITY$" ] 
                    => issue(store="_ProxyCredentialStore",types=("http 
              ://schemas.microsoft.com/authorization/claims/permit"),query="isProxyTrust 
              Provisioned({0})", param=c.Value); 
ArtifactDbConnection      : Data Source=np:\\.\pipe\microsoft##wid\tsql\query;Initial 
              Catalog=AdfsArtifactStore;Integrated Security=True 
AuthenticationContextOrder     : {urn:oasis:names:tc:SAML:2.0:ac:classes:Password, 
              urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport, 
              urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient, 
              urn:oasis:names:tc:SAML:2.0:ac:classes:X509...} 
AutoCertificateRollover     : True 
CertificateCriticalThreshold    : 2 
CertificateDuration      : 365 
CertificateGenerationThreshold    : 20 
CertificatePromotionThreshold    : 5 
CertificateRolloverInterval    : 720 
CertificateSharingContainer    : CN=6b987b00-35ce-44d9-97c8-561b6f1ac3dd,CN=ADFS,CN=Microsoft,CN=Program 
              Data,DC=sciemetricdev,DC=com 
CertificateThresholdMultiplier    : 1440 
ClientCertRevocationCheck     : None 
ContactPerson        : 
DisplayName        : ADFS 
IntranetUseLocalClaimsProvider    : False 
ExtendedProtectionTokenCheck    : Allow 
FederationPassiveAddress     : /adfs/ls/ 
HostName         : *************.com 
HttpPort         : 80 
HttpsPort         : 443 
TlsClientPort        : 49443 
Identifier         : http://*******.com/adfs/services/trust 
InstalledLanguage       : en-US 
LogLevel         : {Errors, Information, Verbose, Warnings} 
MonitoringInterval       : 1440 
NetTcpPort         : 1501 
NtlmOnlySupportedClientAtProxy    : False 
OrganizationInfo       : 
PreventTokenReplays      : False 
ProxyTrustTokenLifetime     : 21600 
ReplayCacheExpirationInterval    : 60 
SignedSamlRequestsRequired     : False 
SamlMessageDeliveryWindow     : 5 
SignSamlAuthnRequests      : False 
SsoLifetime        : 480 
PersistentSsoLifetimeMins     : 10080 
KmsiLifetimeMins       : 1440 
PersistentSsoEnabled      : True 
PersistentSsoCutoffTime     : 1/1/0001 12:00:00 AM 
KmsiEnabled        : False 
LoopDetectionEnabled      : True 
LoopDetectionTimeIntervalInSeconds   : 20 
LoopDetectionMaximumTokensIssuedInInterval : 5 
PasswordValidationDelayInMinutes   : 60 
SendClientRequestIdAsQueryStringParameter : False 
WIASupportedUserAgents      : {MSAuthHost/1.0/In-Domain, MSIE 6.0, MSIE 7.0, MSIE 8.0...} 
ExtranetLockoutThreshold     : 2147483647 
ExtranetLockoutEnabled      : False 
ExtranetObservationWindow     : 00:30:00 
+0

Использование PowerShell и просто перепроверить свойство «компьютера ADFS AcceptableIdentifiers». Запустите: 'add-PSSNapin Microsoft.Adfs.PowerShell' для загрузки snapin. И команда get-adfsproperties –

+0

добавлены свойства adfs. не уверен, что это помогает! – TrustyCoder

ответ

0

Похоже, что вы не создали проверяющую партию в вашем ADFS для URL, который вы передаете в свойстве rts.AppliesTo (realm переменных в коде)

Токены, которые вы получаете из ADFS, не универсальны, они полезны только для доступа к конкретному серверу, который вы передаете в этом свойстве запроса. Даже для того же идентификатора пользователя, если вам нужен доступ к другому серверу, вам нужно будет получить еще один токен из ADFS.

Кроме того, вы не сможете проверить претензии в заявке, запрашивающей токен. Вам нужно передать маркер на сервер и предоставить серверу для показа претензий.

Вот пример такого приложения сервера: http://blogs.technet.com/b/tangent_thoughts/archive/2015/02/20/install-and-configure-a-simple-net-4-5-sample-federated-application-samapp.aspx