2011-01-19 56 views
2

我有以下代碼嘗試使用WIF發出「發出」請求。WIF WSTrustSerializationException - 聲明方言不能設置爲自定義值?

當我運行它時,我得到以下異常。使用定製索賠的問題請求安全令牌是不是可能?

Additional information: ID3257: RequestSecurityToken contains at least one Claim with a Claim value specified but the RequestClaimCollection.Dialect is set to 'urn:custom_namespace:sts:1_0'. The RequestClaimCollection.Dialect must be set to 'http://docs.oasis-open.org/wsfed/authorization/200706/authclaims' for the value to be serialized out. 

代碼:

private const string CLAIMS_DIALECT = "urn:custom_namespace:sts:1_0"; 
private const string REQUEST_CLAIM_TYPE = "urn:custom_namespace:sts:1_0"; 
private const string REQUEST_CLAIM_VALUE = "urn:oasis:names:tc:SAML2.0:consent:current-explicit"; 


public System.IdentityModel.Tokens.SecurityToken RequestSecurityToken(string input) 
{ 
    System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); 

    WS2007HttpBinding binding = new WS2007HttpBinding(); 
    binding.Security.Mode = SecurityMode.TransportWithMessageCredential; 
    binding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; 

    var trustChannelFactory = new WSTrustChannelFactory(binding, new EndpointAddress(new Uri(STS_URL))); 
    trustChannelFactory.TrustVersion = TrustVersion.WSTrust13; 

    trustChannelFactory.Credentials.ClientCertificate.Certificate = GetCertificateBySubjectName(LOCALHOST_CERTIFICATE_SUBJECT_NAME); 
    trustChannelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust; 
    trustChannelFactory.Credentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck; 

    try 
    { 
     RequestSecurityToken rst = new RequestSecurityToken(); 

     rst.AppliesTo = new EndpointAddress(new Uri(APPLIES_TO_URL), new X509CertificateEndpointIdentity(GetCertificateBySubjectName(LOGON_SERVICE_CERTIFICATE_SUBJECT_NAME))); 
     rst.ActAs = BuildSecurityTokenElementFromInput(input); 
     rst.RequestType = RequestTypes.Issue; 
     rst.Lifetime = new Lifetime(DateTime.UtcNow, DateTime.UtcNow.AddMinutes(5)); 
     rst.Claims.Dialect = CLAIMS_DIALECT; 
     var requestClaim = new RequestClaim(REQUEST_CLAIM_TYPE, false, REQUEST_CLAIM_VALUE); 
     rst.Claims.Add(requestClaim); 

     WSTrustChannel channel = (WSTrustChannel)trustChannelFactory.CreateChannel(); 

     RequestSecurityTokenResponse rstr = null; 

     return channel.Issue(rst, out rstr); 
    } 
    finally 
    { 
     trustChannelFactory.Close(); 
    } 
} 

回答

0

我不知道你需要改變rst.Claims.Dialect爲了使這項工作。如果你把它作爲默認值會發生什麼?

0

您想要將請求的聲明添加到RequestSecurityToken。這意味着STS應該以指定的聲明頒發令牌。 基本上不需要它,但如果你是舒服,你必須設置方言。那是真實的。