2016-02-26 73 views
0

我試圖從.net web api獲取來自ADFS服務器的令牌,內部部署Windows身份驗證,同時請求我獲取下面的異常。通過使用用戶名混合從ADFS請求令牌

類型「System.ServiceModel.Security.MessageSecurityException」發生在 mscorlib.dll中但在用戶代碼的附加信息沒有處理的一個例外: HTTP請求與客戶端認證方案禁止 「匿名」 。

代碼,即可獲得令牌如下

var trustChannelFactory = new WSTrustChannelFactory(new UserNameWSTrustBinding(
       System.ServiceModel.SecurityMode.TransportWithMessageCredential), 
       new System.ServiceModel.EndpointAddress(new Uri("https://ADFSSERVER/adfs/services/trust/13/usernamemixed"))) 
      { 
       TrustVersion = TrustVersion.WSTrust13, 
       Credentials = { UserName = { UserName = "DCK", Password = "gfgfg" } },    
      }; 

      var requestSecurityToken = new RequestSecurityToken 
      { 
       RequestType = RequestTypes.Issue, 
       KeyType = KeyTypes.Bearer, 
       AppliesTo = new EndpointReference("urn:feedbackapp") 

      }; 

      RequestSecurityTokenResponse response; 
      var securityToken = trustChannelFactory.CreateChannel().Issue(requestSecurityToken, out response); 
      return securityToken; 

你能幫助我的人繼續獲得令牌

回答

0
var binding = WSTrust13Bindings.UsernameMixed; 
var serviceUri = new Uri(_config.StsUri, "/adfs/services/trust/13/usernamemixed"); 
using (var factory = new WSTrustChannelFactory(binding, serviceUri.AbsoluteUri)) 
{ 
    factory.TrustVersion = TrustVersion.WSTrust13; 
    factory.Credentials.UserName.UserName = userName; 
    factory.Credentials.UserName.Password = password; 

    RequestSecurityTokenResponse response; 
    var channel = factory.CreateChannel(); 
    channel.Issue(new RequestSecurityToken() 
    { 
     RequestType = RequestTypes.Issue, 
     AppliesTo = new EndpointReference(_config.ResourceUri.ToString()), 
     KeyType = KeyTypes.Bearer 
    }, out response); 

    var sb = new StringBuilder(); 
    var ser = new WSTrust13ResponseSerializer(); 
    using (var sw = new StringWriter(sb, CultureInfo.InvariantCulture)) 
    { 
     var xw = XmlTextWriter.Create(sw, new XmlWriterSettings() { OmitXmlDeclaration = true }); 
     ser.WriteXml(response, xw, new WSTrustSerializationContext(factory.SecurityTokenHandlerCollectionManager)); 
     xw.Flush(); 
    } 
    return sb.ToString(); 
}