public async Task <string> GetSignInLinkAsync(IActivity activity, string connectionName, CancellationToken cancellationToken = default(CancellationToken)) { if (connectionName == null) { throw new ValidationException(ValidationRules.CannotBeNull, "connectionName"); } if (activity == null) { throw new ValidationException(ValidationRules.CannotBeNull, "activity"); } bool _shouldTrace = ServiceClientTracing.IsEnabled; string _invocationId = null; if (_shouldTrace) { _invocationId = ServiceClientTracing.NextInvocationId.ToString(); Dictionary <string, object> tracingParameters = new Dictionary <string, object>(); tracingParameters.Add("activity", activity); tracingParameters.Add("connectionName", connectionName); tracingParameters.Add("cancellationToken", cancellationToken); ServiceClientTracing.Enter(_invocationId, this, "GetSignInLinkAsync", tracingParameters); } var tokenExchangeState = new TokenExchangeState() { ConnectionName = connectionName, Conversation = new ConversationReference() { ActivityId = activity.Id, Bot = activity.Recipient, // Activity is from the user to the bot ChannelId = activity.ChannelId, Conversation = activity.Conversation, ServiceUrl = activity.ServiceUrl, User = activity.From }, MsAppId = (Client.Credentials as MicrosoftAppCredentials)?.MicrosoftAppId }; var serializedState = JsonConvert.SerializeObject(tokenExchangeState); var encodedState = Encoding.UTF8.GetBytes(serializedState); var finalState = Convert.ToBase64String(encodedState); // Construct URL var _baseUrl = Client.BaseUri.AbsoluteUri; var _url = new System.Uri(new System.Uri(_baseUrl + (_baseUrl.EndsWith("/") ? "" : "/")), "api/botsignin/getsigninurl?&state={state}").ToString(); _url = _url.Replace("{state}", finalState); // Create HTTP transport objects var _httpRequest = new HttpRequestMessage(); HttpResponseMessage _httpResponse = null; _httpRequest.Method = new HttpMethod("GET"); _httpRequest.RequestUri = new System.Uri(_url); // Set Credentials if (Client.Credentials != null) { cancellationToken.ThrowIfCancellationRequested(); await Client.Credentials.ProcessHttpRequestAsync(_httpRequest, cancellationToken).ConfigureAwait(false); } cancellationToken.ThrowIfCancellationRequested(); if (_shouldTrace) { ServiceClientTracing.SendRequest(_invocationId, _httpRequest); } _httpResponse = await Client.HttpClient.SendAsync(_httpRequest, cancellationToken).ConfigureAwait(false); if (_shouldTrace) { ServiceClientTracing.ReceiveResponse(_invocationId, _httpResponse); } HttpStatusCode _statusCode = _httpResponse.StatusCode; cancellationToken.ThrowIfCancellationRequested(); if (_statusCode == HttpStatusCode.OK) { var link = await _httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false); return(link); } return(String.Empty); }
/// <summary> /// Get the raw signin link to be sent to the user for signin for a connection name. /// </summary> /// <param name="activity">An activity from the user to the bot.</param> /// <param name="connectionName">Name of the auth connection to get a link for.</param> /// <param name="cancellationToken">A cancellation token that can be used by other objects /// or threads to receive notice of cancellation.</param> /// <returns>A task that represents the work queued to execute.</returns> /// <remarks>If the task completes successfully and the call to the OAuth client is successful, /// the result contains the signin link.</remarks> public async Task <string> GetSignInLinkAsync(IActivity activity, string connectionName, CancellationToken cancellationToken = default(CancellationToken)) { if (string.IsNullOrEmpty(connectionName)) { throw new ArgumentNullException(nameof(connectionName)); } if (activity == null) { throw new ArgumentNullException(nameof(activity)); } bool shouldTrace = ServiceClientTracing.IsEnabled; string invocationId = null; if (shouldTrace) { invocationId = ServiceClientTracing.NextInvocationId.ToString(); Dictionary <string, object> tracingParameters = new Dictionary <string, object>(); tracingParameters.Add("activity", activity); tracingParameters.Add("connectionName", connectionName); tracingParameters.Add("cancellationToken", cancellationToken); ServiceClientTracing.Enter(invocationId, this, "GetSignInLinkAsync", tracingParameters); } var tokenExchangeState = new TokenExchangeState() { ConnectionName = connectionName, Conversation = new ConversationReference() { ActivityId = activity.Id, Bot = activity.Recipient, // Activity is from the user to the bot ChannelId = activity.ChannelId, Conversation = activity.Conversation, ServiceUrl = activity.ServiceUrl, User = activity.From }, MsAppId = (_client.Credentials as MicrosoftAppCredentials)?.MicrosoftAppId }; var serializedState = JsonConvert.SerializeObject(tokenExchangeState); var encodedState = Encoding.UTF8.GetBytes(serializedState); var finalState = Convert.ToBase64String(encodedState); // Construct URL var tokenUrl = new Uri(new Uri(_uri + (_uri.EndsWith("/") ? "" : "/")), "api/botsignin/getsigninurl?&state={state}").ToString(); tokenUrl = tokenUrl.Replace("{state}", finalState); // add botframework api service url to the list of trusted service url's for these app credentials. MicrosoftAppCredentials.TrustServiceUrl(tokenUrl); // Create HTTP transport objects var httpRequest = new HttpRequestMessage(); HttpResponseMessage httpResponse = null; httpRequest.Method = new HttpMethod("GET"); httpRequest.RequestUri = new Uri(tokenUrl); // Set Credentials if (_client.Credentials != null) { cancellationToken.ThrowIfCancellationRequested(); await _client.Credentials.ProcessHttpRequestAsync(httpRequest, cancellationToken).ConfigureAwait(false); } cancellationToken.ThrowIfCancellationRequested(); if (shouldTrace) { ServiceClientTracing.SendRequest(invocationId, httpRequest); } httpResponse = await _client.HttpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false); if (shouldTrace) { ServiceClientTracing.ReceiveResponse(invocationId, httpResponse); } HttpStatusCode statusCode = httpResponse.StatusCode; cancellationToken.ThrowIfCancellationRequested(); if (statusCode == HttpStatusCode.OK) { var link = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false); return(link); } return(String.Empty); }