/// <summary> /// Sends a <see cref="WsTrustRequest"/> to a STS to obtain a <see cref="WCFSecurityToken"/>. /// </summary> /// <param name="trustRequest">The <see cref="WsTrustRequest" /> sent to the STS.</param> /// <returns>A <see cref="WCFSecurityToken" /> issued by the STS.</returns> public async virtual Task <WCFSecurityToken> IssueAsync(WsTrustRequest trustRequest) { _ = trustRequest ?? throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(trustRequest)); Message requestMessage = CreateRequest(trustRequest); Message response = await Task.Factory.FromAsync(RequestChannel.BeginRequest, RequestChannel.EndRequest, requestMessage, null, TaskCreationOptions.None).ConfigureAwait(false); if (response.IsFault) { MessageFault fault = MessageFault.CreateFault(response, FaultMaxBufferSize); throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(FaultException.CreateFault(fault, response.Headers?.Action)); } WsTrustResponse trustResponse = TrustSerializer.ReadResponse(response.GetReaderAtBodyContents()); WCFSecurityToken token = WSTrustUtilities.CreateGenericXmlSecurityToken(trustRequest, trustResponse, GetSerializationContext(trustRequest), null); if (token == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityTokenException(SR.Format(SR.TokenProviderUnableToGetToken, string.IsNullOrEmpty(Address) ? ToString() : Address))); } return(token); }
/// <summary> /// Override of the base class method. Serializes the <see cref="WsTrustRequest"/> into the <see cref="XmlDictionaryWriter"/>. /// </summary> /// <param name="writer"> The <see cref="XmlDictionaryWriter"/> to serialize the <see cref="WsTrustRequest"/> into.</param> protected override void OnWriteBodyContents(XmlDictionaryWriter writer) { TrustSerializer.WriteRequest(writer, TrustRequest.WsTrustVersion, TrustRequest); }