From e463cea1eca96fc0fd792ef4ca53bae412ec8d70 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 14 Jul 2016 20:21:00 +0100 Subject: [PATCH 01/55] Updating Graph ResourceId The ResourceId was set to graph.windows.net while correct graph resource is graph.microsoft.com as defined in https://graph.microsoft.io/en-us/docs/authorization/app_authorization. with graph.windows.net calls to graph api return 401 unauthorized. --- SampleAADv1Bot/Web.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SampleAADv1Bot/Web.config b/SampleAADv1Bot/Web.config index 35fa335..d11d818 100644 --- a/SampleAADv1Bot/Web.config +++ b/SampleAADv1Bot/Web.config @@ -11,7 +11,7 @@ - + From 4c24401014a88bcf71853a7524f06161b5513b40 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Wed, 20 Jul 2016 14:59:15 +0100 Subject: [PATCH 02/55] Added Visual Studio Online oAuth2 support --- AuthBot/AuthBot.csproj | 1 + .../Controllers/OAuthCallbackController.cs | 10 ++++- AuthBot/Helpers/VisualStudioOnlineHelper.cs | 44 +++++++++++++++++++ SampleAADv1Bot/SampleAADv1Bot.csproj | 7 ++- SampleAADv1Bot/Web.config | 37 ++++++++++++---- 5 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 AuthBot/Helpers/VisualStudioOnlineHelper.cs diff --git a/AuthBot/AuthBot.csproj b/AuthBot/AuthBot.csproj index cd370d8..c57518c 100644 --- a/AuthBot/AuthBot.csproj +++ b/AuthBot/AuthBot.csproj @@ -116,6 +116,7 @@ + diff --git a/AuthBot/Controllers/OAuthCallbackController.cs b/AuthBot/Controllers/OAuthCallbackController.cs index c600984..a1d2470 100644 --- a/AuthBot/Controllers/OAuthCallbackController.cs +++ b/AuthBot/Controllers/OAuthCallbackController.cs @@ -79,9 +79,15 @@ public async Task OAuthCallback([FromUri] string code, [Fro else if (string.Equals(AuthSettings.Mode, "b2c", StringComparison.OrdinalIgnoreCase)) { } + else if (string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) + { + // Exchange the Auth code with Access token + var token = await VisualStudioOnlineHelper.GetTokenByAuthCodeAsync(code); + authResult = token; + } + + - - var data = await client.Bots.GetUserDataAsync(resumptionCookie.BotId, resumptionCookie.UserId ); int magicNumber = GenerateRandomNumber(); data.SetProperty(ContextConstants.AuthResultKey, authResult); diff --git a/AuthBot/Helpers/VisualStudioOnlineHelper.cs b/AuthBot/Helpers/VisualStudioOnlineHelper.cs new file mode 100644 index 0000000..911ae07 --- /dev/null +++ b/AuthBot/Helpers/VisualStudioOnlineHelper.cs @@ -0,0 +1,44 @@ +using AuthBot.Models; +using Microsoft.Bot.Builder.Dialogs; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; +using System.Web; + +namespace AuthBot.Helpers +{ + class VisualStudioOnlineHelper + { + public static string GetAuthUrlAsync(ResumptionCookie resumptionCookie) + { + var encodedCookie = Microsoft.Bot.Builder.Dialogs.UrlToken.Encode(resumptionCookie); + return String.Format("{0}/oauth2/authorize?client_id={1}&response_type=Assertion&state={2}&scope={3}&redirect_uri={4}", AuthSettings.EndpointUrl, AuthSettings.ClientId, encodedCookie, AuthSettings.Tenant, AuthSettings.RedirectUrl); + } + public static async Task GetTokenByAuthCodeAsync(string authorizationCode) + { + using (var client = new HttpClient()) + { + + client.BaseAddress = new Uri("https://app.vssps.visualstudio.com"); + using (var request = new HttpRequestMessage(HttpMethod.Post, String.Empty)) + { + var postData = string.Format("/oauth2/token?client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}", AuthSettings.ClientSecret, authorizationCode, AuthSettings.RedirectUrl); + request.Content = new StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded"); + HttpResponseMessage response = await client.SendAsync(request); + var str = await response.Content.ReadAsStringAsync(); + + //AuthResult authResult = AuthResult.FromADALAuthenticationResult(result, tokenCache); + AuthResult authResult = null; + return authResult; + + } + } + } + } +} diff --git a/SampleAADv1Bot/SampleAADv1Bot.csproj b/SampleAADv1Bot/SampleAADv1Bot.csproj index ce97bcc..bec9ee1 100644 --- a/SampleAADv1Bot/SampleAADv1Bot.csproj +++ b/SampleAADv1Bot/SampleAADv1Bot.csproj @@ -15,7 +15,7 @@ SampleAADV1Bot v4.6 true - + 44338 @@ -146,6 +146,7 @@ + Web.config @@ -174,7 +175,9 @@ True 3978 / - http://localhost:3978/ + https://localhost:44338/ + True + https://localhost:44338/ False False diff --git a/SampleAADv1Bot/Web.config b/SampleAADv1Bot/Web.config index d11d818..eb66000 100644 --- a/SampleAADv1Bot/Web.config +++ b/SampleAADv1Bot/Web.config @@ -6,17 +6,38 @@ - - + + + + - - + + + + + + + + + + + + + + + From 5b657f2bb708220b422b2f07c358497d60b56964 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Wed, 20 Jul 2016 15:17:26 +0100 Subject: [PATCH 03/55] Added files tu support VSO oAuth2 authentication --- .../Controllers/OAuthCallbackController.cs | 8 +++- AuthBot/Dialogs/AzureAuthDialog.cs | 9 ++++- SampleAADv1Bot/SampleAADv1Bot.csproj | 10 +++-- SampleAADv1Bot/Web.config | 37 ++++++++++++++----- 4 files changed, 49 insertions(+), 15 deletions(-) diff --git a/AuthBot/Controllers/OAuthCallbackController.cs b/AuthBot/Controllers/OAuthCallbackController.cs index d25aacc..a23897d 100644 --- a/AuthBot/Controllers/OAuthCallbackController.cs +++ b/AuthBot/Controllers/OAuthCallbackController.cs @@ -84,7 +84,13 @@ public async Task OAuthCallback([FromUri] string code, [Fro else if (string.Equals(AuthSettings.Mode, "b2c", StringComparison.OrdinalIgnoreCase)) { } - + else if (string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) + { + // Exchange the Auth code with Access token + var token = await VisualStudioOnlineHelper.GetTokenByAuthCodeAsync(code); + authResult = token; + } + IStateClient sc = scope.Resolve(); var dataBag = scope.Resolve(); diff --git a/AuthBot/Dialogs/AzureAuthDialog.cs b/AuthBot/Dialogs/AzureAuthDialog.cs index 2060292..e314583 100644 --- a/AuthBot/Dialogs/AzureAuthDialog.cs +++ b/AuthBot/Dialogs/AzureAuthDialog.cs @@ -129,7 +129,14 @@ private async Task LogIn(IDialogContext context, IMessageActivity msg, string re { var resumptionCookie = new ResumptionCookie(msg); - var authenticationUrl = await AzureActiveDirectoryHelper.GetAuthUrlAsync(resumptionCookie, resourceId); + String authenticationUrl; + if (string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) + { + authenticationUrl = VisualStudioOnlineHelper.GetAuthUrlAsync(resumptionCookie); + } + else + { authenticationUrl = await AzureActiveDirectoryHelper.GetAuthUrlAsync(resumptionCookie, resourceId); } + await context.PostAsync($"You must be authenticated before you can proceed. Please, click [here]({authenticationUrl}) to log into your account."); diff --git a/SampleAADv1Bot/SampleAADv1Bot.csproj b/SampleAADv1Bot/SampleAADv1Bot.csproj index 170e98a..a0ae473 100644 --- a/SampleAADv1Bot/SampleAADv1Bot.csproj +++ b/SampleAADv1Bot/SampleAADv1Bot.csproj @@ -45,10 +45,6 @@ CS1998 - - ..\packages\AuthBot.3.0.2-alpha\lib\net40\AuthBot.dll - True - ..\packages\Autofac.4.0.0-rc3-309\lib\net451\Autofac.dll True @@ -201,6 +197,12 @@ Web.config + + + {b8ad59d3-c36d-4e18-b504-06871001bc8d} + AuthBot + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/SampleAADv1Bot/Web.config b/SampleAADv1Bot/Web.config index 918faf7..5416361 100644 --- a/SampleAADv1Bot/Web.config +++ b/SampleAADv1Bot/Web.config @@ -6,18 +6,37 @@ - - - + + + - - + + + + + + + + + + + + + + + From bf0e882b94b4f49073b5ec938e31c0d7f50d8067 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 21 Jul 2016 18:23:24 +0100 Subject: [PATCH 04/55] Furthere the implementation of VSO authentication --- AuthBot/AuthBot.csproj | 1 + .../Controllers/OAuthCallbackController.cs | 2 +- AuthBot/Helpers/AzureActiveDirectoryHelper.cs | 1 - AuthBot/Helpers/VisualStudioOnlineHelper.cs | 103 ++++++++++++++++-- AuthBot/Models/AuthResult.cs | 1 + AuthBot/Models/VSOAuthResult.cs | 39 +++++++ SampleAADv1Bot/Dialogs/ActionDialog.cs | 3 +- SampleAADv1Bot/SampleAADv1Bot.csproj | 3 + SampleAADv1Bot/default.htm | 4 +- 9 files changed, 140 insertions(+), 17 deletions(-) create mode 100644 AuthBot/Models/VSOAuthResult.cs diff --git a/AuthBot/AuthBot.csproj b/AuthBot/AuthBot.csproj index 348472a..b44d1ed 100644 --- a/AuthBot/AuthBot.csproj +++ b/AuthBot/AuthBot.csproj @@ -163,6 +163,7 @@ + diff --git a/AuthBot/Controllers/OAuthCallbackController.cs b/AuthBot/Controllers/OAuthCallbackController.cs index a23897d..f405a1f 100644 --- a/AuthBot/Controllers/OAuthCallbackController.cs +++ b/AuthBot/Controllers/OAuthCallbackController.cs @@ -88,7 +88,7 @@ public async Task OAuthCallback([FromUri] string code, [Fro { // Exchange the Auth code with Access token var token = await VisualStudioOnlineHelper.GetTokenByAuthCodeAsync(code); - authResult = token; + VSOAuthResult _VsoAuthResult = token; } IStateClient sc = scope.Resolve(); diff --git a/AuthBot/Helpers/AzureActiveDirectoryHelper.cs b/AuthBot/Helpers/AzureActiveDirectoryHelper.cs index a2897a6..4bcb35f 100644 --- a/AuthBot/Helpers/AzureActiveDirectoryHelper.cs +++ b/AuthBot/Helpers/AzureActiveDirectoryHelper.cs @@ -46,7 +46,6 @@ public static async Task GetAuthUrlAsync(ResumptionCookie resumptionCook // "&scope=" + HttpUtility.UrlEncode("openid profile " + string.Join(" ", scopes)) + // "&state=" + encodedCookie; - var uri = await client.GetAuthorizationRequestUrlAsync( scopes, null, diff --git a/AuthBot/Helpers/VisualStudioOnlineHelper.cs b/AuthBot/Helpers/VisualStudioOnlineHelper.cs index 911ae07..c1ff8a2 100644 --- a/AuthBot/Helpers/VisualStudioOnlineHelper.cs +++ b/AuthBot/Helpers/VisualStudioOnlineHelper.cs @@ -1,5 +1,6 @@ using AuthBot.Models; using Microsoft.Bot.Builder.Dialogs; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; @@ -17,28 +18,110 @@ class VisualStudioOnlineHelper { public static string GetAuthUrlAsync(ResumptionCookie resumptionCookie) { + //To Do Change Tenant to Scope var encodedCookie = Microsoft.Bot.Builder.Dialogs.UrlToken.Encode(resumptionCookie); return String.Format("{0}/oauth2/authorize?client_id={1}&response_type=Assertion&state={2}&scope={3}&redirect_uri={4}", AuthSettings.EndpointUrl, AuthSettings.ClientId, encodedCookie, AuthSettings.Tenant, AuthSettings.RedirectUrl); } - public static async Task GetTokenByAuthCodeAsync(string authorizationCode) + public static async Task GetTokenByAuthCodeAsync(string authorizationCode) { + VSOAuthResult authResult=null; + using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://app.vssps.visualstudio.com"); - using (var request = new HttpRequestMessage(HttpMethod.Post, String.Empty)) - { - var postData = string.Format("/oauth2/token?client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}", AuthSettings.ClientSecret, authorizationCode, AuthSettings.RedirectUrl); + using (var request = new HttpRequestMessage(HttpMethod.Post, "/oauth2/token")) + { + var postData = GenerateRequestPostData(authorizationCode); request.Content = new StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded"); HttpResponseMessage response = await client.SendAsync(request); - var str = await response.Content.ReadAsStringAsync(); - - //AuthResult authResult = AuthResult.FromADALAuthenticationResult(result, tokenCache); - AuthResult authResult = null; - return authResult; - + if (response.StatusCode == HttpStatusCode.OK) + { + var strWebAuthResponse = await response.Content.ReadAsStringAsync(); + + authResult = VSOAuthResult.FromVSOAuthenticationResult(strWebAuthResponse); + } } } + + + //if (!String.IsNullOrEmpty(authorizationCode)) + //{ + // error = PerformTokenRequest(GenerateRequestPostData(authorizationCode), out token); + // if (!String.IsNullOrEmpty(error)) + // { + // //Manage error + // } + + //} + + return authResult; } + + //private static String PerformTokenRequest(String postData, out TokenModel token) + //{ + // var error = String.Empty; + // var strResponseData = String.Empty; + + // HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://app.vssps.visualstudio.com/oauth2/token"); + + // webRequest.Method = "POST"; + // webRequest.ContentLength = postData.Length; + // webRequest.ContentType = "application/x-www-form-urlencoded"; + + // using (StreamWriter swRequestWriter = new StreamWriter(webRequest.GetRequestStream())) + // { + // swRequestWriter.Write(postData); + // } + + // try + // { + // HttpWebResponse hwrWebResponse = (HttpWebResponse)webRequest.GetResponse(); + + // if (hwrWebResponse.StatusCode == HttpStatusCode.OK) + // { + // using (StreamReader srResponseReader = new StreamReader(hwrWebResponse.GetResponseStream())) + // { + // strResponseData = srResponseReader.ReadToEnd(); + // } + + // token = JsonConvert.DeserializeObject(strResponseData); + // return null; + // } + // } + // catch (WebException wex) + // { + // error = "Request Issue: " + wex.Message; + // } + // catch (Exception ex) + // { + // error = "Issue: " + ex.Message; + // } + + // token = new TokenModel(); + // return error; + //} + + + public static string GenerateRequestPostData(string code) + { + return string.Format("client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}", + HttpUtility.UrlEncode(AuthSettings.ClientSecret), + HttpUtility.UrlEncode(code), + AuthSettings.RedirectUrl + ); + } + + public static string GenerateRefreshPostData(string refreshToken) + { + return string.Format("client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=refresh_token&assertion={1}&redirect_uri={2}", + HttpUtility.UrlEncode(AuthSettings.ClientSecret), + HttpUtility.UrlEncode(refreshToken), + AuthSettings.RedirectUrl + ); + + } + + } } diff --git a/AuthBot/Models/AuthResult.cs b/AuthBot/Models/AuthResult.cs index c13cc61..afaaa2b 100644 --- a/AuthBot/Models/AuthResult.cs +++ b/AuthBot/Models/AuthResult.cs @@ -39,6 +39,7 @@ public static AuthResult FromMSALAuthenticationResult(Microsoft.Identity.Client. return result; } + } } //********************************************************* diff --git a/AuthBot/Models/VSOAuthResult.cs b/AuthBot/Models/VSOAuthResult.cs new file mode 100644 index 0000000..b11b788 --- /dev/null +++ b/AuthBot/Models/VSOAuthResult.cs @@ -0,0 +1,39 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AuthBot.Models +{ + + public class VSOAuthResult + { + public VSOAuthResult() { } + + [JsonProperty(PropertyName = "access_token")] + public String accessToken { get; set; } + + [JsonProperty(PropertyName = "token_type")] + public String tokenType { get; set; } + + [JsonProperty(PropertyName = "expires_in")] + public String expiresIn { get; set; } + + [JsonProperty(PropertyName = "refresh_token")] + public String refreshToken { get; set; } + public static VSOAuthResult FromVSOAuthenticationResult(String strWebAuthResponse) + { + VSOAuthResult token = new VSOAuthResult(); + token = JsonConvert.DeserializeObject(strWebAuthResponse); + + return token; + } + } + + + + + +} diff --git a/SampleAADv1Bot/Dialogs/ActionDialog.cs b/SampleAADv1Bot/Dialogs/ActionDialog.cs index 72faa82..7d2bdec 100644 --- a/SampleAADv1Bot/Dialogs/ActionDialog.cs +++ b/SampleAADv1Bot/Dialogs/ActionDialog.cs @@ -39,8 +39,6 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl if (message.Text == "logon") { - - //endpoint v1 if (string.IsNullOrEmpty(await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]))) { @@ -68,6 +66,7 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl } else { + await context.PostAsync("say what ?"); context.Wait(MessageReceivedAsync); } } diff --git a/SampleAADv1Bot/SampleAADv1Bot.csproj b/SampleAADv1Bot/SampleAADv1Bot.csproj index a0ae473..9494bb9 100644 --- a/SampleAADv1Bot/SampleAADv1Bot.csproj +++ b/SampleAADv1Bot/SampleAADv1Bot.csproj @@ -203,6 +203,9 @@ AuthBot + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/SampleAADv1Bot/default.htm b/SampleAADv1Bot/default.htm index a6f1707..20f0da4 100644 --- a/SampleAADv1Bot/default.htm +++ b/SampleAADv1Bot/default.htm @@ -5,9 +5,7 @@ -

Sample AAD v1 Bot

- - +

Sample AAD v1 Bot (Tiagoand v1)

From 10e64f68cd7d5b5efd35727a69b67f45c1d880a8 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 21 Jul 2016 19:09:12 +0100 Subject: [PATCH 05/55] processing AuthResults and storing token --- .../Controllers/OAuthCallbackController.cs | 4 +- AuthBot/Helpers/VisualStudioOnlineHelper.cs | 11 +++-- AuthBot/Models/AuthResult.cs | 40 +++++++++++++++++-- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/AuthBot/Controllers/OAuthCallbackController.cs b/AuthBot/Controllers/OAuthCallbackController.cs index f405a1f..f62defe 100644 --- a/AuthBot/Controllers/OAuthCallbackController.cs +++ b/AuthBot/Controllers/OAuthCallbackController.cs @@ -69,6 +69,7 @@ public async Task OAuthCallback([FromUri] string code, [Fro { var client = scope.Resolve(); AuthResult authResult = null; + if (string.Equals(AuthSettings.Mode, "v1", StringComparison.OrdinalIgnoreCase)) { // Exchange the Auth code with Access token @@ -87,8 +88,7 @@ public async Task OAuthCallback([FromUri] string code, [Fro else if (string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) { // Exchange the Auth code with Access token - var token = await VisualStudioOnlineHelper.GetTokenByAuthCodeAsync(code); - VSOAuthResult _VsoAuthResult = token; + authResult = await VisualStudioOnlineHelper.GetTokenByAuthCodeAsync(code); } IStateClient sc = scope.Resolve(); diff --git a/AuthBot/Helpers/VisualStudioOnlineHelper.cs b/AuthBot/Helpers/VisualStudioOnlineHelper.cs index c1ff8a2..4a4e53d 100644 --- a/AuthBot/Helpers/VisualStudioOnlineHelper.cs +++ b/AuthBot/Helpers/VisualStudioOnlineHelper.cs @@ -22,9 +22,10 @@ public static string GetAuthUrlAsync(ResumptionCookie resumptionCookie) var encodedCookie = Microsoft.Bot.Builder.Dialogs.UrlToken.Encode(resumptionCookie); return String.Format("{0}/oauth2/authorize?client_id={1}&response_type=Assertion&state={2}&scope={3}&redirect_uri={4}", AuthSettings.EndpointUrl, AuthSettings.ClientId, encodedCookie, AuthSettings.Tenant, AuthSettings.RedirectUrl); } - public static async Task GetTokenByAuthCodeAsync(string authorizationCode) + public static async Task GetTokenByAuthCodeAsync(string authorizationCode) { - VSOAuthResult authResult=null; + AuthResult authResult = null; + VSOAuthResult _VSOauthResult=null; using (var client = new HttpClient()) { @@ -38,10 +39,12 @@ public static async Task GetTokenByAuthCodeAsync(string authoriza if (response.StatusCode == HttpStatusCode.OK) { var strWebAuthResponse = await response.Content.ReadAsStringAsync(); - - authResult = VSOAuthResult.FromVSOAuthenticationResult(strWebAuthResponse); + + _VSOauthResult = VSOAuthResult.FromVSOAuthenticationResult(strWebAuthResponse); + authResult = AuthResult.FromVSOAuthenticationResult(_VSOauthResult); } } + } diff --git a/AuthBot/Models/AuthResult.cs b/AuthBot/Models/AuthResult.cs index afaaa2b..01a46e3 100644 --- a/AuthBot/Models/AuthResult.cs +++ b/AuthBot/Models/AuthResult.cs @@ -11,7 +11,15 @@ public class AuthResult public string UserUniqueId { get; set; } public long ExpiresOnUtcTicks { get; set; } public byte[] TokenCache { get; set; } - + + public String tokenType { get; set; } + + public String expiresIn { get; set; } + + public String refreshToken { get; set; } + + public String authType { get; set; } //if AD or VSO + public static AuthResult FromADALAuthenticationResult(Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult authResult, Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache tokenCache) { var result = new AuthResult @@ -20,7 +28,11 @@ public static AuthResult FromADALAuthenticationResult(Microsoft.IdentityModel.Cl UserName = $"{authResult.UserInfo.GivenName} {authResult.UserInfo.FamilyName}", UserUniqueId = authResult.UserInfo.UniqueId, ExpiresOnUtcTicks = authResult.ExpiresOn.UtcTicks, - TokenCache = tokenCache.Serialize() + TokenCache = tokenCache.Serialize(), + tokenType = "not defined via AD auth", + expiresIn = "not defined via AD auth", + refreshToken = "not defined via AD auth", + authType = "ad" }; return result; @@ -34,12 +46,34 @@ public static AuthResult FromMSALAuthenticationResult(Microsoft.Identity.Client. UserName = $"{authResult.User.Name}", UserUniqueId = authResult.User.UniqueId, ExpiresOnUtcTicks = authResult.ExpiresOn.UtcTicks, - TokenCache = tokenCache.Serialize() + TokenCache = tokenCache.Serialize(), + tokenType = "not defined via AD auth", + expiresIn = "not defined via AD auth", + refreshToken = "not defined via AD auth", + + authType = "ad" }; return result; } + public static AuthResult FromVSOAuthenticationResult(VSOAuthResult authResult) + { + var result = new AuthResult + { + AccessToken = authResult.accessToken, + UserName = "not defined via VSO", + UserUniqueId = "not defined via VSO", + ExpiresOnUtcTicks = -1, + TokenCache = new byte [0], + tokenType = authResult.tokenType, + expiresIn =authResult.expiresIn, + refreshToken=authResult.refreshToken, + authType = "vso" + }; + + return result; + } } } //********************************************************* From 7a2dc14b2772856ace3bb83b949136ccd6e996ef Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 21 Jul 2016 19:33:22 +0100 Subject: [PATCH 06/55] Removed code that was commented. removed expiresIn auth result from VSO to use sames as AD result ExpiresOnUtcTicks. Started implementing GetAccessToken. --- AuthBot/ContextExtensions.cs | 19 ++++--- AuthBot/Helpers/VisualStudioOnlineHelper.cs | 56 --------------------- AuthBot/Models/AuthResult.cs | 10 ++-- 3 files changed, 17 insertions(+), 68 deletions(-) diff --git a/AuthBot/ContextExtensions.cs b/AuthBot/ContextExtensions.cs index 5944bf9..a510167 100644 --- a/AuthBot/ContextExtensions.cs +++ b/AuthBot/ContextExtensions.cs @@ -18,12 +18,19 @@ public static async Task GetAccessToken(this IBotContext context, string { try { - InMemoryTokenCacheADAL tokenCache = new InMemoryTokenCacheADAL(authResult.TokenCache); - var result = await AzureActiveDirectoryHelper.GetToken(authResult.UserUniqueId, tokenCache, resourceId); - authResult.AccessToken = result.AccessToken; - authResult.ExpiresOnUtcTicks = result.ExpiresOnUtcTicks; - authResult.TokenCache = tokenCache.Serialize(); - context.StoreAuthResult(authResult); + if (string.Equals(authResult.authType, "vso", StringComparison.OrdinalIgnoreCase)) + { + //is Token still valid ? + + } + else { + InMemoryTokenCacheADAL tokenCache = new InMemoryTokenCacheADAL(authResult.TokenCache); + var result = await AzureActiveDirectoryHelper.GetToken(authResult.UserUniqueId, tokenCache, resourceId); + authResult.AccessToken = result.AccessToken; + authResult.ExpiresOnUtcTicks = result.ExpiresOnUtcTicks; + authResult.TokenCache = tokenCache.Serialize(); + context.StoreAuthResult(authResult); + } } catch (Exception ex) { diff --git a/AuthBot/Helpers/VisualStudioOnlineHelper.cs b/AuthBot/Helpers/VisualStudioOnlineHelper.cs index 4a4e53d..5d54a78 100644 --- a/AuthBot/Helpers/VisualStudioOnlineHelper.cs +++ b/AuthBot/Helpers/VisualStudioOnlineHelper.cs @@ -47,65 +47,9 @@ public static async Task GetTokenByAuthCodeAsync(string authorizatio } - - //if (!String.IsNullOrEmpty(authorizationCode)) - //{ - // error = PerformTokenRequest(GenerateRequestPostData(authorizationCode), out token); - // if (!String.IsNullOrEmpty(error)) - // { - // //Manage error - // } - - //} - return authResult; } - //private static String PerformTokenRequest(String postData, out TokenModel token) - //{ - // var error = String.Empty; - // var strResponseData = String.Empty; - - // HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://app.vssps.visualstudio.com/oauth2/token"); - - // webRequest.Method = "POST"; - // webRequest.ContentLength = postData.Length; - // webRequest.ContentType = "application/x-www-form-urlencoded"; - - // using (StreamWriter swRequestWriter = new StreamWriter(webRequest.GetRequestStream())) - // { - // swRequestWriter.Write(postData); - // } - - // try - // { - // HttpWebResponse hwrWebResponse = (HttpWebResponse)webRequest.GetResponse(); - - // if (hwrWebResponse.StatusCode == HttpStatusCode.OK) - // { - // using (StreamReader srResponseReader = new StreamReader(hwrWebResponse.GetResponseStream())) - // { - // strResponseData = srResponseReader.ReadToEnd(); - // } - - // token = JsonConvert.DeserializeObject(strResponseData); - // return null; - // } - // } - // catch (WebException wex) - // { - // error = "Request Issue: " + wex.Message; - // } - // catch (Exception ex) - // { - // error = "Issue: " + ex.Message; - // } - - // token = new TokenModel(); - // return error; - //} - - public static string GenerateRequestPostData(string code) { return string.Format("client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}", diff --git a/AuthBot/Models/AuthResult.cs b/AuthBot/Models/AuthResult.cs index 01a46e3..b8c3f0b 100644 --- a/AuthBot/Models/AuthResult.cs +++ b/AuthBot/Models/AuthResult.cs @@ -14,8 +14,6 @@ public class AuthResult public String tokenType { get; set; } - public String expiresIn { get; set; } - public String refreshToken { get; set; } public String authType { get; set; } //if AD or VSO @@ -30,7 +28,6 @@ public static AuthResult FromADALAuthenticationResult(Microsoft.IdentityModel.Cl ExpiresOnUtcTicks = authResult.ExpiresOn.UtcTicks, TokenCache = tokenCache.Serialize(), tokenType = "not defined via AD auth", - expiresIn = "not defined via AD auth", refreshToken = "not defined via AD auth", authType = "ad" }; @@ -48,7 +45,6 @@ public static AuthResult FromMSALAuthenticationResult(Microsoft.Identity.Client. ExpiresOnUtcTicks = authResult.ExpiresOn.UtcTicks, TokenCache = tokenCache.Serialize(), tokenType = "not defined via AD auth", - expiresIn = "not defined via AD auth", refreshToken = "not defined via AD auth", authType = "ad" @@ -59,15 +55,17 @@ public static AuthResult FromMSALAuthenticationResult(Microsoft.Identity.Client. public static AuthResult FromVSOAuthenticationResult(VSOAuthResult authResult) { + + long _expiresOnUtcTicks = DateTime.UtcNow.AddSeconds(Int32.Parse(authResult.expiresIn)).Ticks; + var result = new AuthResult { AccessToken = authResult.accessToken, UserName = "not defined via VSO", UserUniqueId = "not defined via VSO", - ExpiresOnUtcTicks = -1, + ExpiresOnUtcTicks = _expiresOnUtcTicks, TokenCache = new byte [0], tokenType = authResult.tokenType, - expiresIn =authResult.expiresIn, refreshToken=authResult.refreshToken, authType = "vso" }; From 81ced6af3daf4917db241e9d6eb7c0cf04c6699d Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 21 Jul 2016 19:49:01 +0100 Subject: [PATCH 07/55] Converted some internal method from Public to Private. Added method to check if VSO token expired. contiued implementation of GetAccessToken for VSO --- AuthBot/ContextExtensions.cs | 7 +++++++ AuthBot/Helpers/VisualStudioOnlineHelper.cs | 9 +++++++-- AuthBot/Models/AuthResult.cs | 18 +++++++++--------- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/AuthBot/ContextExtensions.cs b/AuthBot/ContextExtensions.cs index a510167..dd6f120 100644 --- a/AuthBot/ContextExtensions.cs +++ b/AuthBot/ContextExtensions.cs @@ -21,6 +21,13 @@ public static async Task GetAccessToken(this IBotContext context, string if (string.Equals(authResult.authType, "vso", StringComparison.OrdinalIgnoreCase)) { //is Token still valid ? + if (VisualStudioOnlineHelper.IsTokenExpired(authResult.ExpiresOnUtcTicks)) + { + //renew token + await context.PostAsync("Your VSO credentials expired and could not be renewed automatically!"); + await context.Logout(); + return null; + } } else { diff --git a/AuthBot/Helpers/VisualStudioOnlineHelper.cs b/AuthBot/Helpers/VisualStudioOnlineHelper.cs index 5d54a78..ae979e1 100644 --- a/AuthBot/Helpers/VisualStudioOnlineHelper.cs +++ b/AuthBot/Helpers/VisualStudioOnlineHelper.cs @@ -50,7 +50,7 @@ public static async Task GetTokenByAuthCodeAsync(string authorizatio return authResult; } - public static string GenerateRequestPostData(string code) + private static string GenerateRequestPostData(string code) { return string.Format("client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}", HttpUtility.UrlEncode(AuthSettings.ClientSecret), @@ -59,7 +59,7 @@ public static string GenerateRequestPostData(string code) ); } - public static string GenerateRefreshPostData(string refreshToken) + private static string GenerateRefreshPostData(string refreshToken) { return string.Format("client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=refresh_token&assertion={1}&redirect_uri={2}", HttpUtility.UrlEncode(AuthSettings.ClientSecret), @@ -69,6 +69,11 @@ public static string GenerateRefreshPostData(string refreshToken) } + public static bool IsTokenExpired(long _expiresOnUtcTicks) { + + return DateTime.UtcNow.Ticks > _expiresOnUtcTicks; + + } } } diff --git a/AuthBot/Models/AuthResult.cs b/AuthBot/Models/AuthResult.cs index b8c3f0b..51cb9d8 100644 --- a/AuthBot/Models/AuthResult.cs +++ b/AuthBot/Models/AuthResult.cs @@ -27,9 +27,9 @@ public static AuthResult FromADALAuthenticationResult(Microsoft.IdentityModel.Cl UserUniqueId = authResult.UserInfo.UniqueId, ExpiresOnUtcTicks = authResult.ExpiresOn.UtcTicks, TokenCache = tokenCache.Serialize(), - tokenType = "not defined via AD auth", - refreshToken = "not defined via AD auth", - authType = "ad" + tokenType = String.Empty, + refreshToken = String.Empty, + authType = "AD" }; return result; @@ -44,10 +44,10 @@ public static AuthResult FromMSALAuthenticationResult(Microsoft.Identity.Client. UserUniqueId = authResult.User.UniqueId, ExpiresOnUtcTicks = authResult.ExpiresOn.UtcTicks, TokenCache = tokenCache.Serialize(), - tokenType = "not defined via AD auth", - refreshToken = "not defined via AD auth", + tokenType = String.Empty, + refreshToken = String.Empty, - authType = "ad" + authType = "AD" }; return result; @@ -61,13 +61,13 @@ public static AuthResult FromVSOAuthenticationResult(VSOAuthResult authResult) var result = new AuthResult { AccessToken = authResult.accessToken, - UserName = "not defined via VSO", - UserUniqueId = "not defined via VSO", + UserName = String.Empty, + UserUniqueId = String.Empty, ExpiresOnUtcTicks = _expiresOnUtcTicks, TokenCache = new byte [0], tokenType = authResult.tokenType, refreshToken=authResult.refreshToken, - authType = "vso" + authType = "VSO" }; return result; From efcc51fe87b490c7c403813c97a9485d67adba00 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Fri, 22 Jul 2016 10:13:14 +0100 Subject: [PATCH 08/55] Reverted SampleAADv1Bot to original code. Created Sample project SsampleVSOBot. Implemented Logout flow in AuthBot --- AuthBot.sln | 9 +- AuthBot/ContextExtensions.cs | 24 ++- SampleAADv1Bot/Dialogs/ActionDialog.cs | 3 +- SampleAADv1Bot/SampleAADv1Bot.csproj | 13 +- SampleAADv1Bot/Web.config | 39 +--- SampleAADv1Bot/default.htm | 4 +- SampleVSOBot/App_Start/WebApiConfig.cs | 27 +++ .../Controllers/MessagesController.cs | 83 ++++++++ SampleVSOBot/Dialogs/ActionDialog.cs | 118 +++++++++++ SampleVSOBot/Dialogs/DialogExtensions.cs | 91 +++++++++ SampleVSOBot/Global.asax | 1 + SampleVSOBot/Global.asax.cs | 24 +++ SampleVSOBot/Properties/AssemblyInfo.cs | 35 ++++ SampleVSOBot/SampleVSOBot.csproj | 183 ++++++++++++++++++ SampleVSOBot/Web.Debug.config | 30 +++ SampleVSOBot/Web.Release.config | 31 +++ SampleVSOBot/Web.config | 100 ++++++++++ SampleVSOBot/default.htm | 10 + SampleVSOBot/packages.config | 15 ++ 19 files changed, 792 insertions(+), 48 deletions(-) create mode 100644 SampleVSOBot/App_Start/WebApiConfig.cs create mode 100644 SampleVSOBot/Controllers/MessagesController.cs create mode 100644 SampleVSOBot/Dialogs/ActionDialog.cs create mode 100644 SampleVSOBot/Dialogs/DialogExtensions.cs create mode 100644 SampleVSOBot/Global.asax create mode 100644 SampleVSOBot/Global.asax.cs create mode 100644 SampleVSOBot/Properties/AssemblyInfo.cs create mode 100644 SampleVSOBot/SampleVSOBot.csproj create mode 100644 SampleVSOBot/Web.Debug.config create mode 100644 SampleVSOBot/Web.Release.config create mode 100644 SampleVSOBot/Web.config create mode 100644 SampleVSOBot/default.htm create mode 100644 SampleVSOBot/packages.config diff --git a/AuthBot.sln b/AuthBot.sln index aa180de..e9bf68a 100644 --- a/AuthBot.sln +++ b/AuthBot.sln @@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OneDriveBot", "OneDriveBot\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleAADv1Bot", "SampleAADv1Bot\SampleAADv1Bot.csproj", "{D2253234-1279-486E-8A63-D8C3424E0525}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleVSOBot", "SampleVSOBot\SampleVSOBot.csproj", "{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -22,17 +24,18 @@ Global {B8AD59D3-C36D-4E18-B504-06871001BC8D}.Release|Any CPU.ActiveCfg = Release|Any CPU {B8AD59D3-C36D-4E18-B504-06871001BC8D}.Release|Any CPU.Build.0 = Release|Any CPU {DFDC62CE-993B-461E-99DB-F079F46105C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DFDC62CE-993B-461E-99DB-F079F46105C5}.Debug|Any CPU.Build.0 = Debug|Any CPU {DFDC62CE-993B-461E-99DB-F079F46105C5}.Release|Any CPU.ActiveCfg = Release|Any CPU {DFDC62CE-993B-461E-99DB-F079F46105C5}.Release|Any CPU.Build.0 = Release|Any CPU {44BE2EEE-3F57-44D0-A298-C0967048DAE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {44BE2EEE-3F57-44D0-A298-C0967048DAE8}.Debug|Any CPU.Build.0 = Debug|Any CPU {44BE2EEE-3F57-44D0-A298-C0967048DAE8}.Release|Any CPU.ActiveCfg = Release|Any CPU {44BE2EEE-3F57-44D0-A298-C0967048DAE8}.Release|Any CPU.Build.0 = Release|Any CPU {D2253234-1279-486E-8A63-D8C3424E0525}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2253234-1279-486E-8A63-D8C3424E0525}.Debug|Any CPU.Build.0 = Debug|Any CPU {D2253234-1279-486E-8A63-D8C3424E0525}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2253234-1279-486E-8A63-D8C3424E0525}.Release|Any CPU.Build.0 = Release|Any CPU + {A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/AuthBot/ContextExtensions.cs b/AuthBot/ContextExtensions.cs index dd6f120..1b1a8f3 100644 --- a/AuthBot/ContextExtensions.cs +++ b/AuthBot/ContextExtensions.cs @@ -95,11 +95,25 @@ public static void StoreAuthResult(this IBotContext context, AuthResult authResu public static async Task Logout(this IBotContext context) { - context.UserData.RemoveValue(ContextConstants.AuthResultKey); - context.UserData.RemoveValue(ContextConstants.MagicNumberKey); - context.UserData.RemoveValue(ContextConstants.MagicNumberValidated); - string signoutURl = "https://login.microsoftonline.com/common/oauth2/logout?post_logout_redirect_uri=" + System.Net.WebUtility.UrlEncode(AuthSettings.RedirectUrl); - await context.PostAsync($"In order to finish the sign out, please click at this [link]({signoutURl})."); + AuthResult authResult; + string signoutURl; + + if (context.UserData.TryGetValue(ContextConstants.AuthResultKey, out authResult)) + { + context.UserData.RemoveValue(ContextConstants.AuthResultKey); + context.UserData.RemoveValue(ContextConstants.MagicNumberKey); + context.UserData.RemoveValue(ContextConstants.MagicNumberValidated); + if (string.Equals(authResult.authType, "vso", StringComparison.OrdinalIgnoreCase)) + { + signoutURl = "//https://app.vssps.visualstudio.com/_signout"; + } + else + { + signoutURl = "https://login.microsoftonline.com/common/oauth2/logout?post_logout_redirect_uri=" + System.Net.WebUtility.UrlEncode(AuthSettings.RedirectUrl); + } + + await context.PostAsync($"In order to finish the sign out, please click at this [link]({signoutURl})."); + } } } diff --git a/SampleAADv1Bot/Dialogs/ActionDialog.cs b/SampleAADv1Bot/Dialogs/ActionDialog.cs index 7d2bdec..72faa82 100644 --- a/SampleAADv1Bot/Dialogs/ActionDialog.cs +++ b/SampleAADv1Bot/Dialogs/ActionDialog.cs @@ -39,6 +39,8 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl if (message.Text == "logon") { + + //endpoint v1 if (string.IsNullOrEmpty(await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]))) { @@ -66,7 +68,6 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl } else { - await context.PostAsync("say what ?"); context.Wait(MessageReceivedAsync); } } diff --git a/SampleAADv1Bot/SampleAADv1Bot.csproj b/SampleAADv1Bot/SampleAADv1Bot.csproj index 9494bb9..170e98a 100644 --- a/SampleAADv1Bot/SampleAADv1Bot.csproj +++ b/SampleAADv1Bot/SampleAADv1Bot.csproj @@ -45,6 +45,10 @@ CS1998
+ + ..\packages\AuthBot.3.0.2-alpha\lib\net40\AuthBot.dll + True + ..\packages\Autofac.4.0.0-rc3-309\lib\net451\Autofac.dll True @@ -197,15 +201,6 @@ Web.config - - - {b8ad59d3-c36d-4e18-b504-06871001bc8d} - AuthBot - - - - - 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/SampleAADv1Bot/Web.config b/SampleAADv1Bot/Web.config index 5416361..4eb6c9a 100644 --- a/SampleAADv1Bot/Web.config +++ b/SampleAADv1Bot/Web.config @@ -6,37 +6,18 @@ - - - + + + - - - + + - - - - --> - - - - - - - - - - - - + + + + diff --git a/SampleAADv1Bot/default.htm b/SampleAADv1Bot/default.htm index 20f0da4..a6f1707 100644 --- a/SampleAADv1Bot/default.htm +++ b/SampleAADv1Bot/default.htm @@ -5,7 +5,9 @@ -

Sample AAD v1 Bot (Tiagoand v1)

+

Sample AAD v1 Bot

+ + diff --git a/SampleVSOBot/App_Start/WebApiConfig.cs b/SampleVSOBot/App_Start/WebApiConfig.cs new file mode 100644 index 0000000..01b4ed9 --- /dev/null +++ b/SampleVSOBot/App_Start/WebApiConfig.cs @@ -0,0 +1,27 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web.Http; + +namespace SampleVSOBot +{ + public static class WebApiConfig + { + public static void Register(HttpConfiguration config) + { + // Web API configuration and services + + // Web API routes + config.MapHttpAttributeRoutes(); + + config.Routes.MapHttpRoute( + name: "DefaultApi", + routeTemplate: "api/{controller}/{id}", + defaults: new { id = RouteParameter.Optional } + ); + } + + } +} diff --git a/SampleVSOBot/Controllers/MessagesController.cs b/SampleVSOBot/Controllers/MessagesController.cs new file mode 100644 index 0000000..eda929b --- /dev/null +++ b/SampleVSOBot/Controllers/MessagesController.cs @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See full license at the bottom of this file. +namespace SampleVSOBot +{ + using System.Linq; + using System.Text.RegularExpressions; + using System.Threading.Tasks; + using System.Web.Http; + using Dialogs; + using Microsoft.Bot.Builder.Dialogs; + using Microsoft.Bot.Builder.FormFlow; + using Microsoft.Bot.Connector; + using System.Web.Http.Description; + using System.Net.Http; + + [BotAuthentication] + public class MessagesController : ApiController + { + /// + /// POST: api/Messages + /// Receive a message from a user and reply to it + /// + [BotAuthentication] + + public virtual async Task Post([FromBody]Activity activity) + { + if (activity != null && activity.GetActivityType() == ActivityTypes.Message) + { + await Conversation.SendAsync(activity, () => new ActionDialog()); + } + else + { + this.HandleSystemMessage(activity); + } + return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted); + } + + private Activity HandleSystemMessage(Activity message) + { + if (message.Type == ActivityTypes.Ping) + { + Activity reply = message.CreateReply(); + reply.Type = ActivityTypes.Ping; + return reply; + } + + return null; + } + } +} +//********************************************************* +// +//AuthBot, https://github.com/matvelloso/AuthBot +// +//Copyright (c) Microsoft Corporation +//All rights reserved. +// +// MIT License: +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// ""Software""), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: + + + + +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. + + + + +// THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* diff --git a/SampleVSOBot/Dialogs/ActionDialog.cs b/SampleVSOBot/Dialogs/ActionDialog.cs new file mode 100644 index 0000000..d96b033 --- /dev/null +++ b/SampleVSOBot/Dialogs/ActionDialog.cs @@ -0,0 +1,118 @@ +// Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See full license at the bottom of this file. +namespace SampleVSOBot.Dialogs +{ + using System; + using System.Threading; + using System.Threading.Tasks; + using AuthBot; + using AuthBot.Dialogs; + using AuthBot.Models; + using Microsoft.Bot.Builder.Dialogs; + using Microsoft.Bot.Connector; + using System.Configuration; + [Serializable] + public class ActionDialog : IDialog + { + public async Task StartAsync(IDialogContext context) + { + context.Wait(MessageReceivedAsync); + } + + public async Task TokenSample(IDialogContext context) + { + //endpoint v1 + var accessToken = await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]); + + if (string.IsNullOrEmpty(accessToken)) + { + return; + } + + await context.PostAsync($"Your access token is: {accessToken}"); + + context.Wait(MessageReceivedAsync); + } + + public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable item) + { + var message = await item; + + if (message.Text == "logon") + { + //endpoint v1 + if (string.IsNullOrEmpty(await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]))) + { + await context.Forward(new AzureAuthDialog(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]), this.ResumeAfterAuth, message, CancellationToken.None); + } + else + { + context.Wait(MessageReceivedAsync); + } + } + else if (message.Text == "echo") + { + await context.PostAsync("echo"); + + context.Wait(this.MessageReceivedAsync); + } + else if (message.Text == "token") + { + await TokenSample(context); + } + else if (message.Text == "logout") + { + await context.Logout(); + context.Wait(this.MessageReceivedAsync); + } + else + { + await context.PostAsync("say what ?"); + context.Wait(MessageReceivedAsync); + } + } + + private async Task ResumeAfterAuth(IDialogContext context, IAwaitable result) + { + var message = await result; + + await context.PostAsync(message); + context.Wait(MessageReceivedAsync); + } + } +} + + +//********************************************************* +// +//AuthBot, https://github.com/matvelloso/AuthBot +// +//Copyright (c) Microsoft Corporation +//All rights reserved. +// +// MIT License: +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// ""Software""), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: + + + + +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. + + + + +// THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* diff --git a/SampleVSOBot/Dialogs/DialogExtensions.cs b/SampleVSOBot/Dialogs/DialogExtensions.cs new file mode 100644 index 0000000..6c8bb52 --- /dev/null +++ b/SampleVSOBot/Dialogs/DialogExtensions.cs @@ -0,0 +1,91 @@ +// Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See full license at the bottom of this file. +namespace SampleVSOBot.Dialogs +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + using Autofac; + using Microsoft.Bot.Builder.Dialogs; + using Microsoft.Bot.Builder.Dialogs.Internals; + using Microsoft.Bot.Builder.Luis.Models; + using Microsoft.Bot.Connector; + + public static class DialogExtensions + { + public static void NotifyLongRunningOperation(this Task operation, IDialogContext context, Func handler) + { + operation.ContinueWith( + async (t, ctx) => + { + var messageText = handler(t.Result); + await NotifyUser((IDialogContext)ctx, messageText); + }, + context); + } + + public static void NotifyLongRunningOperation(this Task operation, IDialogContext context, Func handler) + { + operation.ContinueWith( + async (t, ctx) => + { + var messageText = handler(t.Result, (IDialogContext)ctx); + await NotifyUser((IDialogContext)ctx, messageText); + }, + context); + } + + public static string GetEntityOriginalText(this EntityRecommendation recommendation, string query) + { + if (recommendation.StartIndex.HasValue && recommendation.EndIndex.HasValue) + { + return query.Substring(recommendation.StartIndex.Value, recommendation.EndIndex.Value - recommendation.StartIndex.Value + 1); + } + + return null; + } + + public static async Task NotifyUser(this IDialogContext context, string messageText) + { + if (!string.IsNullOrEmpty(messageText)) + { + await context.PostAsync(messageText); + } + } + } +} + +//********************************************************* +// +//AuthBot, https://github.com/matvelloso/AuthBot +// +//Copyright (c) Microsoft Corporation +//All rights reserved. +// +// MIT License: +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// ""Software""), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: + + + + +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. + + + + +// THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* diff --git a/SampleVSOBot/Global.asax b/SampleVSOBot/Global.asax new file mode 100644 index 0000000..75be4e8 --- /dev/null +++ b/SampleVSOBot/Global.asax @@ -0,0 +1 @@ +<%@ Application Codebehind="Global.asax.cs" Inherits="SampleVSOBot.WebApiApplication" Language="C#" %> diff --git a/SampleVSOBot/Global.asax.cs b/SampleVSOBot/Global.asax.cs new file mode 100644 index 0000000..1d57ca0 --- /dev/null +++ b/SampleVSOBot/Global.asax.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Web; +using System.Web.Http; +using System.Web.Routing; + +namespace SampleVSOBot +{ + public class WebApiApplication : System.Web.HttpApplication + { + protected void Application_Start() + { + GlobalConfiguration.Configure(WebApiConfig.Register); + AuthBot.Models.AuthSettings.Mode = ConfigurationManager.AppSettings["ActiveDirectory.Mode"]; + AuthBot.Models.AuthSettings.EndpointUrl = ConfigurationManager.AppSettings["ActiveDirectory.EndpointUrl"]; + AuthBot.Models.AuthSettings.Tenant = ConfigurationManager.AppSettings["ActiveDirectory.Tenant"]; + AuthBot.Models.AuthSettings.RedirectUrl = ConfigurationManager.AppSettings["ActiveDirectory.RedirectUrl"]; + AuthBot.Models.AuthSettings.ClientId = ConfigurationManager.AppSettings["ActiveDirectory.ClientId"]; + AuthBot.Models.AuthSettings.ClientSecret = ConfigurationManager.AppSettings["ActiveDirectory.ClientSecret"]; + } + } +} diff --git a/SampleVSOBot/Properties/AssemblyInfo.cs b/SampleVSOBot/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b895370 --- /dev/null +++ b/SampleVSOBot/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SampleVSOBot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SampleVSOBot")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a8ba1066-5695-4d71-abb4-65e5a5e0c3d4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SampleVSOBot/SampleVSOBot.csproj b/SampleVSOBot/SampleVSOBot.csproj new file mode 100644 index 0000000..c395373 --- /dev/null +++ b/SampleVSOBot/SampleVSOBot.csproj @@ -0,0 +1,183 @@ + + + + + Debug + AnyCPU + + + 2.0 + {A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + SampleVSOBot + Bot Application1 + v4.6 + true + 44370 + + + + + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + ..\packages\Autofac.3.5.2\lib\net40\Autofac.dll + True + + + ..\packages\Chronic.Signed.0.3.2\lib\net40\Chronic.dll + True + + + ..\packages\Microsoft.Bot.Builder.3.0.1\lib\net46\Microsoft.Bot.Builder.dll + True + + + ..\packages\Microsoft.Bot.Builder.3.0.1\lib\net46\Microsoft.Bot.Connector.dll + True + + + + ..\packages\Microsoft.IdentityModel.Protocol.Extensions.1.0.2.206221351\lib\net45\Microsoft.IdentityModel.Protocol.Extensions.dll + True + + + ..\packages\Microsoft.Rest.ClientRuntime.1.8.2\lib\net45\Microsoft.Rest.ClientRuntime.dll + True + + + ..\packages\Microsoft.WindowsAzure.ConfigurationManager.3.2.1\lib\net40\Microsoft.WindowsAzure.Configuration.dll + True + + + ..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll + True + + + + ..\packages\System.IdentityModel.Tokens.Jwt.4.0.2.206221351\lib\net45\System.IdentityModel.Tokens.Jwt.dll + True + + + + + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + True + + + + + + + + + + + + + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll + True + + + + + + + + + + + + Designer + + + + + + + + + Global.asax + + + + + + + + Web.config + + + Web.config + + + + + {b8ad59d3-c36d-4e18-b504-06871001bc8d} + AuthBot + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + true + + + + + + + + + True + True + 3979 + / + https://localhost:44370/ + True + https://localhost:44370/ + False + False + + + False + + + + + + \ No newline at end of file diff --git a/SampleVSOBot/Web.Debug.config b/SampleVSOBot/Web.Debug.config new file mode 100644 index 0000000..2e302f9 --- /dev/null +++ b/SampleVSOBot/Web.Debug.config @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file diff --git a/SampleVSOBot/Web.Release.config b/SampleVSOBot/Web.Release.config new file mode 100644 index 0000000..c358444 --- /dev/null +++ b/SampleVSOBot/Web.Release.config @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/SampleVSOBot/Web.config b/SampleVSOBot/Web.config new file mode 100644 index 0000000..c2cb2f4 --- /dev/null +++ b/SampleVSOBot/Web.config @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SampleVSOBot/default.htm b/SampleVSOBot/default.htm new file mode 100644 index 0000000..79f5063 --- /dev/null +++ b/SampleVSOBot/default.htm @@ -0,0 +1,10 @@ + + + + + + + +

Sample VSO Bot

+ + \ No newline at end of file diff --git a/SampleVSOBot/packages.config b/SampleVSOBot/packages.config new file mode 100644 index 0000000..a77d566 --- /dev/null +++ b/SampleVSOBot/packages.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file From 56061edc17eada2c1fbd675b799351548651ae03 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Fri, 22 Jul 2016 14:46:42 +0100 Subject: [PATCH 09/55] sorted some dependencies issues --- AuthBot.sln | 10 +-- AuthBot/AuthBot.csproj | 2 +- AuthBot/packages.config | 2 +- OneDriveBot/OneDriveBot.csproj | 2 +- OneDriveBot/packages.config | 4 +- SampleAADv1Bot/SampleAADv1Bot.csproj | 2 +- SampleAADv1Bot/Web.config | 8 +- SampleAADv1Bot/packages.config | 4 +- SampleAADv2Bot/SampleAADv2Bot.csproj | 2 +- SampleAADv2Bot/Web.config | 8 ++ SampleAADv2Bot/packages.config | 2 +- SampleVSOBot/App_Start/WebApiConfig.cs | 38 ++++++++- SampleVSOBot/Dialogs/ActionDialog.cs | 2 + SampleVSOBot/Global.asax.cs | 4 +- SampleVSOBot/Properties/AssemblyInfo.cs | 6 +- SampleVSOBot/SampleVSOBot.csproj | 106 +++++++++++++++++++----- SampleVSOBot/Web.config | 18 +++- SampleVSOBot/default.htm | 7 +- SampleVSOBot/packages.config | 40 ++++++++- 19 files changed, 210 insertions(+), 57 deletions(-) diff --git a/AuthBot.sln b/AuthBot.sln index e9bf68a..7d0619f 100644 --- a/AuthBot.sln +++ b/AuthBot.sln @@ -11,7 +11,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OneDriveBot", "OneDriveBot\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleAADv1Bot", "SampleAADv1Bot\SampleAADv1Bot.csproj", "{D2253234-1279-486E-8A63-D8C3424E0525}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleVSOBot", "SampleVSOBot\SampleVSOBot.csproj", "{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleVSOBot", "SampleVSOBot\SampleVSOBot.csproj", "{4EE65876-C3A8-4F9D-973A-42729E205F94}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -32,10 +32,10 @@ Global {D2253234-1279-486E-8A63-D8C3424E0525}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D2253234-1279-486E-8A63-D8C3424E0525}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2253234-1279-486E-8A63-D8C3424E0525}.Release|Any CPU.Build.0 = Release|Any CPU - {A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.Build.0 = Release|Any CPU + {4EE65876-C3A8-4F9D-973A-42729E205F94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4EE65876-C3A8-4F9D-973A-42729E205F94}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EE65876-C3A8-4F9D-973A-42729E205F94}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4EE65876-C3A8-4F9D-973A-42729E205F94}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/AuthBot/AuthBot.csproj b/AuthBot/AuthBot.csproj index b44d1ed..af020f6 100644 --- a/AuthBot/AuthBot.csproj +++ b/AuthBot/AuthBot.csproj @@ -32,7 +32,7 @@
- ..\packages\Autofac.4.0.0-rc3-309\lib\net451\Autofac.dll + ..\packages\Autofac.4.0.0-rc3-316\lib\net451\Autofac.dll True diff --git a/AuthBot/packages.config b/AuthBot/packages.config index 3f9bb89..92bb02d 100644 --- a/AuthBot/packages.config +++ b/AuthBot/packages.config @@ -1,6 +1,6 @@  - + diff --git a/OneDriveBot/OneDriveBot.csproj b/OneDriveBot/OneDriveBot.csproj index 6539498..ec72488 100644 --- a/OneDriveBot/OneDriveBot.csproj +++ b/OneDriveBot/OneDriveBot.csproj @@ -47,7 +47,7 @@ True - ..\packages\Autofac.4.0.0-rc3-309\lib\net451\Autofac.dll + ..\packages\Autofac.4.0.0-rc3-316\lib\net451\Autofac.dll True diff --git a/OneDriveBot/packages.config b/OneDriveBot/packages.config index b755931..05de621 100644 --- a/OneDriveBot/packages.config +++ b/OneDriveBot/packages.config @@ -1,7 +1,7 @@  - + @@ -29,7 +29,7 @@ - + diff --git a/SampleAADv1Bot/SampleAADv1Bot.csproj b/SampleAADv1Bot/SampleAADv1Bot.csproj index 170e98a..523e1cb 100644 --- a/SampleAADv1Bot/SampleAADv1Bot.csproj +++ b/SampleAADv1Bot/SampleAADv1Bot.csproj @@ -50,7 +50,7 @@ True - ..\packages\Autofac.4.0.0-rc3-309\lib\net451\Autofac.dll + ..\packages\Autofac.4.0.0-rc3-316\lib\net451\Autofac.dll True diff --git a/SampleAADv1Bot/Web.config b/SampleAADv1Bot/Web.config index 4eb6c9a..4703f57 100644 --- a/SampleAADv1Bot/Web.config +++ b/SampleAADv1Bot/Web.config @@ -6,10 +6,10 @@ - - - - + + + + diff --git a/SampleAADv1Bot/packages.config b/SampleAADv1Bot/packages.config index 76ef347..e7b748c 100644 --- a/SampleAADv1Bot/packages.config +++ b/SampleAADv1Bot/packages.config @@ -1,7 +1,7 @@  - + @@ -28,7 +28,7 @@ - + diff --git a/SampleAADv2Bot/SampleAADv2Bot.csproj b/SampleAADv2Bot/SampleAADv2Bot.csproj index a483dd3..3113cef 100644 --- a/SampleAADv2Bot/SampleAADv2Bot.csproj +++ b/SampleAADv2Bot/SampleAADv2Bot.csproj @@ -48,7 +48,7 @@ True - ..\packages\Autofac.4.0.0-rc3-309\lib\net451\Autofac.dll + ..\packages\Autofac.4.0.0-rc3-316\lib\net451\Autofac.dll True diff --git a/SampleAADv2Bot/Web.config b/SampleAADv2Bot/Web.config index 581636e..9bce79e 100644 --- a/SampleAADv2Bot/Web.config +++ b/SampleAADv2Bot/Web.config @@ -83,6 +83,14 @@ + + + + + + + +
diff --git a/SampleAADv2Bot/packages.config b/SampleAADv2Bot/packages.config index a3362f5..e7b748c 100644 --- a/SampleAADv2Bot/packages.config +++ b/SampleAADv2Bot/packages.config @@ -1,7 +1,7 @@  - + diff --git a/SampleVSOBot/App_Start/WebApiConfig.cs b/SampleVSOBot/App_Start/WebApiConfig.cs index 01b4ed9..d41a664 100644 --- a/SampleVSOBot/App_Start/WebApiConfig.cs +++ b/SampleVSOBot/App_Start/WebApiConfig.cs @@ -1,5 +1,4 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; +// Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See full license at the bottom of this file. using System; using System.Collections.Generic; using System.Linq; @@ -22,6 +21,39 @@ public static void Register(HttpConfiguration config) defaults: new { id = RouteParameter.Optional } ); } - } } +//********************************************************* +// +//AuthBot, https://github.com/matvelloso/AuthBot +// +//Copyright (c) Microsoft Corporation +//All rights reserved. +// +// MIT License: +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// ""Software""), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: + + + + +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. + + + + +// THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//********************************************************* diff --git a/SampleVSOBot/Dialogs/ActionDialog.cs b/SampleVSOBot/Dialogs/ActionDialog.cs index d96b033..ad43957 100644 --- a/SampleVSOBot/Dialogs/ActionDialog.cs +++ b/SampleVSOBot/Dialogs/ActionDialog.cs @@ -39,6 +39,8 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl if (message.Text == "logon") { + + //endpoint v1 if (string.IsNullOrEmpty(await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]))) { diff --git a/SampleVSOBot/Global.asax.cs b/SampleVSOBot/Global.asax.cs index 1d57ca0..66fd0ab 100644 --- a/SampleVSOBot/Global.asax.cs +++ b/SampleVSOBot/Global.asax.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.IdentityModel.Protocols; +using System; using System.Collections.Generic; using System.Configuration; using System.Linq; @@ -19,6 +20,7 @@ protected void Application_Start() AuthBot.Models.AuthSettings.RedirectUrl = ConfigurationManager.AppSettings["ActiveDirectory.RedirectUrl"]; AuthBot.Models.AuthSettings.ClientId = ConfigurationManager.AppSettings["ActiveDirectory.ClientId"]; AuthBot.Models.AuthSettings.ClientSecret = ConfigurationManager.AppSettings["ActiveDirectory.ClientSecret"]; + } } } diff --git a/SampleVSOBot/Properties/AssemblyInfo.cs b/SampleVSOBot/Properties/AssemblyInfo.cs index b895370..b2cb87d 100644 --- a/SampleVSOBot/Properties/AssemblyInfo.cs +++ b/SampleVSOBot/Properties/AssemblyInfo.cs @@ -5,12 +5,12 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("SampleVSOBot")] +[assembly: AssemblyTitle("Microsoft.Bot.Sample.EchoBot")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("SampleVSOBot")] -[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyProduct("Microsoft.Bot.Sample.EchoBot")] +[assembly: AssemblyCopyright("Copyright © 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/SampleVSOBot/SampleVSOBot.csproj b/SampleVSOBot/SampleVSOBot.csproj index c395373..457a82b 100644 --- a/SampleVSOBot/SampleVSOBot.csproj +++ b/SampleVSOBot/SampleVSOBot.csproj @@ -1,5 +1,6 @@  + Debug @@ -7,15 +8,15 @@ 2.0 - {A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4} + {4EE65876-C3A8-4F9D-973A-42729E205F94} {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties SampleVSOBot - Bot Application1 + SampleVSOBot v4.6 true - 44370 + @@ -32,6 +33,7 @@ DEBUG;TRACE prompt 4 + CS1998 pdbonly @@ -40,10 +42,11 @@ TRACE prompt 4 + CS1998 - - ..\packages\Autofac.3.5.2\lib\net40\Autofac.dll + + ..\packages\Autofac.4.0.0-rc3-316\lib\net451\Autofac.dll True @@ -59,23 +62,60 @@ True + + ..\packages\Microsoft.Diagnostics.Tracing.EventSource.Redist.1.1.28\lib\net46\Microsoft.Diagnostics.Tracing.EventSource.dll + True + + + ..\packages\Microsoft.Identity.Client.1.0.304142221-alpha\lib\net45\Microsoft.Identity.Client.dll + True + + + ..\packages\Microsoft.Identity.Client.1.0.304142221-alpha\lib\net45\Microsoft.Identity.Client.Platform.dll + True + + + ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.12.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll + True + + + ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.12.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll + True + + + ..\packages\Microsoft.IdentityModel.Logging.1.0.0\lib\net451\Microsoft.IdentityModel.Logging.dll + True + ..\packages\Microsoft.IdentityModel.Protocol.Extensions.1.0.2.206221351\lib\net45\Microsoft.IdentityModel.Protocol.Extensions.dll True + + ..\packages\Microsoft.IdentityModel.Tokens.5.0.0\lib\net451\Microsoft.IdentityModel.Tokens.dll + True + ..\packages\Microsoft.Rest.ClientRuntime.1.8.2\lib\net45\Microsoft.Rest.ClientRuntime.dll True + + ..\packages\Microsoft.Win32.Primitives.4.0.1\lib\net46\Microsoft.Win32.Primitives.dll + True + ..\packages\Microsoft.WindowsAzure.ConfigurationManager.3.2.1\lib\net40\Microsoft.WindowsAzure.Configuration.dll True - - ..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True + + + ..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + True + ..\packages\System.IdentityModel.Tokens.Jwt.4.0.2.206221351\lib\net45\System.IdentityModel.Tokens.Jwt.dll True @@ -87,6 +127,27 @@ True + + + ..\packages\System.Runtime.Serialization.Primitives.4.1.1\lib\net46\System.Runtime.Serialization.Primitives.dll + True + + + ..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net46\System.Security.Cryptography.Algorithms.dll + True + + + ..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll + True + + + ..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll + True + + + ..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net46\System.Security.Cryptography.X509Certificates.dll + True + @@ -128,15 +189,22 @@ - + + Designer + Web.config + Designer Web.config + Designer + + + {b8ad59d3-c36d-4e18-b504-06871001bc8d} @@ -147,9 +215,6 @@ 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
- - true - @@ -157,22 +222,17 @@ - True - True - 3979 - / - https://localhost:44370/ - True - https://localhost:44370/ - False - False - - - False + True + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + - @@ -81,7 +82,7 @@ - + @@ -91,10 +92,19 @@ - + + + + + + + + + + \ No newline at end of file diff --git a/SampleVSOBot/default.htm b/SampleVSOBot/default.htm index 79f5063..e883479 100644 --- a/SampleVSOBot/default.htm +++ b/SampleVSOBot/default.htm @@ -5,6 +5,9 @@ -

Sample VSO Bot

+

Sample VSO Bot

+ + - \ No newline at end of file + + diff --git a/SampleVSOBot/packages.config b/SampleVSOBot/packages.config index a77d566..e7b748c 100644 --- a/SampleVSOBot/packages.config +++ b/SampleVSOBot/packages.config @@ -1,15 +1,51 @@  - + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From b140d03847193caa6a600ae6e8082367d2b9122e Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Mon, 1 Aug 2016 22:30:17 +0100 Subject: [PATCH 10/55] added code to get work items from vso --- AuthBot.sln | 11 ++-- SampleVSOBot/Dialogs/ActionDialog.cs | 32 ++++++++++- SampleVSOBot/Helpers/VSORestHelper.cs | 76 +++++++++++++++++++++++++++ SampleVSOBot/SampleVSOBot.csproj | 1 + SampleVSOBot/Web.config | 19 ------- SampleVSOBot/default.htm | 2 +- 6 files changed, 115 insertions(+), 26 deletions(-) create mode 100644 SampleVSOBot/Helpers/VSORestHelper.cs diff --git a/AuthBot.sln b/AuthBot.sln index 7d0619f..ff5538d 100644 --- a/AuthBot.sln +++ b/AuthBot.sln @@ -9,10 +9,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleAADv2Bot", "SampleAAD EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OneDriveBot", "OneDriveBot\OneDriveBot.csproj", "{44BE2EEE-3F57-44D0-A298-C0967048DAE8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleAADv1Bot", "SampleAADv1Bot\SampleAADv1Bot.csproj", "{D2253234-1279-486E-8A63-D8C3424E0525}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleVSOBot", "SampleVSOBot\SampleVSOBot.csproj", "{4EE65876-C3A8-4F9D-973A-42729E205F94}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleAADv1Bot", "SampleAADv1Bot\SampleAADv1Bot.csproj", "{D2253234-1279-486E-8A63-D8C3424E0525}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -29,13 +29,14 @@ Global {44BE2EEE-3F57-44D0-A298-C0967048DAE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {44BE2EEE-3F57-44D0-A298-C0967048DAE8}.Release|Any CPU.ActiveCfg = Release|Any CPU {44BE2EEE-3F57-44D0-A298-C0967048DAE8}.Release|Any CPU.Build.0 = Release|Any CPU - {D2253234-1279-486E-8A63-D8C3424E0525}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2253234-1279-486E-8A63-D8C3424E0525}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2253234-1279-486E-8A63-D8C3424E0525}.Release|Any CPU.Build.0 = Release|Any CPU {4EE65876-C3A8-4F9D-973A-42729E205F94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4EE65876-C3A8-4F9D-973A-42729E205F94}.Debug|Any CPU.Build.0 = Debug|Any CPU {4EE65876-C3A8-4F9D-973A-42729E205F94}.Release|Any CPU.ActiveCfg = Release|Any CPU {4EE65876-C3A8-4F9D-973A-42729E205F94}.Release|Any CPU.Build.0 = Release|Any CPU + {D2253234-1279-486E-8A63-D8C3424E0525}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2253234-1279-486E-8A63-D8C3424E0525}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2253234-1279-486E-8A63-D8C3424E0525}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2253234-1279-486E-8A63-D8C3424E0525}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SampleVSOBot/Dialogs/ActionDialog.cs b/SampleVSOBot/Dialogs/ActionDialog.cs index ad43957..b6c439b 100644 --- a/SampleVSOBot/Dialogs/ActionDialog.cs +++ b/SampleVSOBot/Dialogs/ActionDialog.cs @@ -10,9 +10,12 @@ namespace SampleVSOBot.Dialogs using Microsoft.Bot.Builder.Dialogs; using Microsoft.Bot.Connector; using System.Configuration; + using Helpers; + [Serializable] public class ActionDialog : IDialog { + public async Task StartAsync(IDialogContext context) { context.Wait(MessageReceivedAsync); @@ -33,6 +36,29 @@ public async Task TokenSample(IDialogContext context) context.Wait(MessageReceivedAsync); } + public async Task GetWorkItems(IDialogContext context) + { + var accessToken = await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]); + + try + { + if (string.IsNullOrEmpty(accessToken)) + { + await context.PostAsync($"Please logon first"); + context.Wait(MessageReceivedAsync); + } + else + { + + String witems = await VSORestHelper.GetWorkItems(accessToken); + await context.PostAsync(witems); + } + } + catch (Exception exc) + { await context.PostAsync($"Error geting work items. Error: {exc.Message}"); } + + context.Wait(MessageReceivedAsync); + } public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable item) { var message = await item; @@ -66,9 +92,13 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl await context.Logout(); context.Wait(this.MessageReceivedAsync); } + else if (message.Text == "work") + { + await GetWorkItems(context); + } else { - await context.PostAsync("say what ?"); + await context.PostAsync("say what ? Please say something like login, logout, token, echo or work"); context.Wait(MessageReceivedAsync); } } diff --git a/SampleVSOBot/Helpers/VSORestHelper.cs b/SampleVSOBot/Helpers/VSORestHelper.cs new file mode 100644 index 0000000..d1bdb74 --- /dev/null +++ b/SampleVSOBot/Helpers/VSORestHelper.cs @@ -0,0 +1,76 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using System.Web; + +namespace SampleVSOBot.Helpers +{ + public static class VSORestHelper + { + public static async Task GetWorkItems(string token) + { + using (var client = new HttpClient()) + { + var apiVersion = "1.0"; + StringBuilder strResult = new StringBuilder(); + + var account = AuthBot.Models.AuthSettings.Tenant; + var query = "Select [System.Id] From WorkItems Where[System.WorkItemType] = 'Bug' order by [System.CreatedDate] desc"; + + var url = "https://" + account + ".visualstudio.com/defaultcollection/_apis/wit/"; + + // Execute a query that returns work item IDs matching the specified criteria + using (var request = new HttpRequestMessage(HttpMethod.Post, url + "wiql")) + { + request.Headers.Add("Authorization", "Bearer " + token); + request.Headers.Add("Accept", "application/json;api-version=" + apiVersion); + + Dictionary body = new Dictionary + { + { + "query", query + } + }; + + request.Content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); + + using (var response = await client.SendAsync(request)) + { + var content = await response.Content.ReadAsStringAsync(); + var workItems = JObject.Parse(content)["workItems"] as JArray; + + string[] ids = workItems.Select(w => (w["id"] + "")).Take(10).ToArray(); + string idsString = String.Join(",", ids); + + // Get details for the last 10 + using (var detailsRequest = new HttpRequestMessage(HttpMethod.Get, url + "workitems?ids=" + idsString + "&fields=System.Id,System.Title")) + { + detailsRequest.Headers.Add("Authorization", "Bearer " + token); + detailsRequest.Headers.Add("Accept", "application/json;api-version=" + apiVersion); + + using (var detailsResponse = await client.SendAsync(detailsRequest)) + { + var detailsContent = await detailsResponse.Content.ReadAsStringAsync(); + var detailsWorkItems = JObject.Parse(detailsContent)["value"] as JArray; + + foreach (dynamic workItem in detailsWorkItems) + { + strResult.AppendFormat("Work item: {0} ({1})", + workItem.fields["System.Id"], + workItem.fields["System.Title"]); + } + } + } + return strResult.ToString(); + } + } + } + } + } + +} \ No newline at end of file diff --git a/SampleVSOBot/SampleVSOBot.csproj b/SampleVSOBot/SampleVSOBot.csproj index 457a82b..e388b17 100644 --- a/SampleVSOBot/SampleVSOBot.csproj +++ b/SampleVSOBot/SampleVSOBot.csproj @@ -186,6 +186,7 @@ Global.asax + diff --git a/SampleVSOBot/Web.config b/SampleVSOBot/Web.config index 67d5252..b44a026 100644 --- a/SampleVSOBot/Web.config +++ b/SampleVSOBot/Web.config @@ -9,25 +9,6 @@ - - - - - - - diff --git a/SampleVSOBot/default.htm b/SampleVSOBot/default.htm index e883479..c4559c2 100644 --- a/SampleVSOBot/default.htm +++ b/SampleVSOBot/default.htm @@ -5,7 +5,7 @@ -

Sample VSO Bot

+

Sample VSO Bot (1.1)

From ffe93ddfda7ecbfb08bdf3c371066205c3458224 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Wed, 3 Aug 2016 21:31:19 +0100 Subject: [PATCH 11/55] Implement refresh VSO token, Scopes read from webconfig. Token command to give more info about token and to refresh if expired. Implemented test command to force expire of token. other minor updates. --- AuthBot/ContextExtensions.cs | 24 +++++++--- AuthBot/Dialogs/AzureAuthDialog.cs | 15 +++--- AuthBot/Helpers/VisualStudioOnlineHelper.cs | 34 ++++++++++++-- SampleVSOBot/Dialogs/ActionDialog.cs | 52 +++++++++++++++++---- SampleVSOBot/Global.asax.cs | 1 + SampleVSOBot/Helpers/VSORestHelper.cs | 9 ++-- SampleVSOBot/Web.config | 4 +- 7 files changed, 109 insertions(+), 30 deletions(-) diff --git a/AuthBot/ContextExtensions.cs b/AuthBot/ContextExtensions.cs index 1b1a8f3..4a6311f 100644 --- a/AuthBot/ContextExtensions.cs +++ b/AuthBot/ContextExtensions.cs @@ -18,15 +18,25 @@ public static async Task GetAccessToken(this IBotContext context, string { try { + //await context.PostAsync($"authToken={authResult.AccessToken}"); + //await context.PostAsync($"ExpiresOnUtcTicks={authResult.ExpiresOnUtcTicks}"); if (string.Equals(authResult.authType, "vso", StringComparison.OrdinalIgnoreCase)) { //is Token still valid ? - if (VisualStudioOnlineHelper.IsTokenExpired(authResult.ExpiresOnUtcTicks)) + if (String.IsNullOrEmpty(authResult.AccessToken)) + { await context.PostAsync("GetAccessToken called but no token exists.Logon first."); } + else if (VisualStudioOnlineHelper.IsTokenExpired(authResult.ExpiresOnUtcTicks)) { //renew token - await context.PostAsync("Your VSO credentials expired and could not be renewed automatically!"); - await context.Logout(); - return null; + DateTime expiredDate = new DateTime(authResult.ExpiresOnUtcTicks); + String expireDateStr = expiredDate.ToString("d/M/yyyy HH:mm:ss"); + await context.PostAsync($"Your VSO credentials expired on {expireDateStr}"); + authResult = await VisualStudioOnlineHelper.RefreshTokenAsync(authResult.refreshToken); + expiredDate = new DateTime(authResult.ExpiresOnUtcTicks); + expireDateStr = expiredDate.ToString("d/M/yyyy HH:mm:ss"); + await context.PostAsync($"Token refreshed. New expire time: {expireDateStr}"); + context.StoreAuthResult(authResult); + return authResult.AccessToken; } } @@ -42,8 +52,8 @@ public static async Task GetAccessToken(this IBotContext context, string catch (Exception ex) { Trace.TraceError("Failed to renew token: " + ex.Message); - await context.PostAsync("Your credentials expired and could not be renewed automatically!"); - await context.Logout(); + await context.PostAsync("Exception in GetAccessToken: " + ex.Message); + //await context.Logout(); return null; } return authResult.AccessToken; @@ -105,7 +115,7 @@ public static async Task Logout(this IBotContext context) context.UserData.RemoveValue(ContextConstants.MagicNumberValidated); if (string.Equals(authResult.authType, "vso", StringComparison.OrdinalIgnoreCase)) { - signoutURl = "//https://app.vssps.visualstudio.com/_signout"; + signoutURl = "https://app.vssps.visualstudio.com/_signout"; } else { diff --git a/AuthBot/Dialogs/AzureAuthDialog.cs b/AuthBot/Dialogs/AzureAuthDialog.cs index e314583..e95018c 100644 --- a/AuthBot/Dialogs/AzureAuthDialog.cs +++ b/AuthBot/Dialogs/AzureAuthDialog.cs @@ -92,12 +92,15 @@ private async Task LogIn(IDialogContext context, IMessageActivity msg, string[] { var resumptionCookie = new ResumptionCookie(msg); - var authenticationUrl = await AzureActiveDirectoryHelper.GetAuthUrlAsync(resumptionCookie, scopes); - - //var reply = msg.CreateReply(); - //reply.Recipient = msg.From; - //reply.From = msg.Recipient; - //reply.Text = $"You must be authenticated before you can proceed. Please, click [here]({authenticationUrl}) to log into your account."; + String authenticationUrl; + if (string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) + { + authenticationUrl = VisualStudioOnlineHelper.GetAuthUrlAsync(resumptionCookie); + } + else + { authenticationUrl = await AzureActiveDirectoryHelper.GetAuthUrlAsync(resumptionCookie, scopes); } + + await context.PostAsync($"You must be authenticated before you can proceed. Please, click [here]({authenticationUrl}) to log into your account."); context.Wait(this.MessageReceivedAsync); diff --git a/AuthBot/Helpers/VisualStudioOnlineHelper.cs b/AuthBot/Helpers/VisualStudioOnlineHelper.cs index ae979e1..fab7e5f 100644 --- a/AuthBot/Helpers/VisualStudioOnlineHelper.cs +++ b/AuthBot/Helpers/VisualStudioOnlineHelper.cs @@ -20,7 +20,8 @@ public static string GetAuthUrlAsync(ResumptionCookie resumptionCookie) { //To Do Change Tenant to Scope var encodedCookie = Microsoft.Bot.Builder.Dialogs.UrlToken.Encode(resumptionCookie); - return String.Format("{0}/oauth2/authorize?client_id={1}&response_type=Assertion&state={2}&scope={3}&redirect_uri={4}", AuthSettings.EndpointUrl, AuthSettings.ClientId, encodedCookie, AuthSettings.Tenant, AuthSettings.RedirectUrl); + var scopes = String.Join(",", AuthSettings.Scopes); + return String.Format("{0}/oauth2/authorize?client_id={1}&response_type=Assertion&state={2}&scope={3}&redirect_uri={4}", AuthSettings.EndpointUrl, AuthSettings.ClientId, encodedCookie, scopes, AuthSettings.RedirectUrl); } public static async Task GetTokenByAuthCodeAsync(string authorizationCode) { @@ -50,6 +51,33 @@ public static async Task GetTokenByAuthCodeAsync(string authorizatio return authResult; } + public static async Task RefreshTokenAsync(string refreshToken) + { + AuthResult authResult = null; + VSOAuthResult _VSOauthResult = null; + + using (var client = new HttpClient()) + { + + client.BaseAddress = new Uri("https://app.vssps.visualstudio.com"); + using (var request = new HttpRequestMessage(HttpMethod.Post, "/oauth2/token")) + { + var postData = GenerateRefreshPostData(refreshToken); + request.Content = new StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded"); + HttpResponseMessage response = await client.SendAsync(request); + if (response.StatusCode == HttpStatusCode.OK) + { + var strWebAuthResponse = await response.Content.ReadAsStringAsync(); + + _VSOauthResult = VSOAuthResult.FromVSOAuthenticationResult(strWebAuthResponse); + authResult = AuthResult.FromVSOAuthenticationResult(_VSOauthResult); + } + } + + } + + return authResult; + } private static string GenerateRequestPostData(string code) { return string.Format("client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}", @@ -58,7 +86,6 @@ private static string GenerateRequestPostData(string code) AuthSettings.RedirectUrl ); } - private static string GenerateRefreshPostData(string refreshToken) { return string.Format("client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=refresh_token&assertion={1}&redirect_uri={2}", @@ -66,14 +93,15 @@ private static string GenerateRefreshPostData(string refreshToken) HttpUtility.UrlEncode(refreshToken), AuthSettings.RedirectUrl ); - } + public static bool IsTokenExpired(long _expiresOnUtcTicks) { return DateTime.UtcNow.Ticks > _expiresOnUtcTicks; } + } } diff --git a/SampleVSOBot/Dialogs/ActionDialog.cs b/SampleVSOBot/Dialogs/ActionDialog.cs index b6c439b..3457bd0 100644 --- a/SampleVSOBot/Dialogs/ActionDialog.cs +++ b/SampleVSOBot/Dialogs/ActionDialog.cs @@ -20,28 +20,62 @@ public async Task StartAsync(IDialogContext context) { context.Wait(MessageReceivedAsync); } - + + public async Task TokenSample(IDialogContext context) { + //endpoint v1 var accessToken = await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]); if (string.IsNullOrEmpty(accessToken)) { - return; + await context.PostAsync($"You don't have an access Token. Please logon first."); } + else + { + AuthResult authResult; + if (context.UserData.TryGetValue(ContextConstants.AuthResultKey, out authResult)) + { + var expiresin= TimeSpan.FromTicks(authResult.ExpiresOnUtcTicks - DateTime.UtcNow.Ticks).TotalMinutes; + if (expiresin < 0) + { await context.PostAsync($"Your access token already expired"); } + else + { + DateTime expiredDate = new DateTime(authResult.ExpiresOnUtcTicks); + String expireDateStr = expiredDate.ToString("d/M/yyyy HH:mm:ss"); + await context.PostAsync($"Your access token expires in {expiresin} minutes ({expireDateStr})"); + await context.PostAsync($"Your access token is: {accessToken}"); + } - await context.PostAsync($"Your access token is: {accessToken}"); + } + } context.Wait(MessageReceivedAsync); } + /// + /// For Testing Purposes / capability to force token expiration + /// + /// + /// + public async Task ForceTokenExpiration(IDialogContext context) + { + AuthResult authResult; + if (context.UserData.TryGetValue(ContextConstants.AuthResultKey, out authResult)) + { + authResult.ExpiresOnUtcTicks = 0; + context.StoreAuthResult(authResult); + await context.PostAsync($"Forced token to expire"); + } + context.Wait(MessageReceivedAsync); + } public async Task GetWorkItems(IDialogContext context) { var accessToken = await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]); try - { + { //todo: check if token has expired if (string.IsNullOrEmpty(accessToken)) { await context.PostAsync($"Please logon first"); @@ -49,7 +83,6 @@ public async Task GetWorkItems(IDialogContext context) } else { - String witems = await VSORestHelper.GetWorkItems(accessToken); await context.PostAsync(witems); } @@ -65,8 +98,6 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl if (message.Text == "logon") { - - //endpoint v1 if (string.IsNullOrEmpty(await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]))) { @@ -74,6 +105,7 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl } else { + await context.PostAsync("already logged in."); context.Wait(MessageReceivedAsync); } } @@ -87,6 +119,10 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl { await TokenSample(context); } + else if (message.Text == "expire") + { + await ForceTokenExpiration(context); + } else if (message.Text == "logout") { await context.Logout(); @@ -98,7 +134,7 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl } else { - await context.PostAsync("say what ? Please say something like login, logout, token, echo or work"); + await context.PostAsync("say what ? Please say something like logon, logout, token, echo or work"); context.Wait(MessageReceivedAsync); } } diff --git a/SampleVSOBot/Global.asax.cs b/SampleVSOBot/Global.asax.cs index 66fd0ab..c5b1dff 100644 --- a/SampleVSOBot/Global.asax.cs +++ b/SampleVSOBot/Global.asax.cs @@ -20,6 +20,7 @@ protected void Application_Start() AuthBot.Models.AuthSettings.RedirectUrl = ConfigurationManager.AppSettings["ActiveDirectory.RedirectUrl"]; AuthBot.Models.AuthSettings.ClientId = ConfigurationManager.AppSettings["ActiveDirectory.ClientId"]; AuthBot.Models.AuthSettings.ClientSecret = ConfigurationManager.AppSettings["ActiveDirectory.ClientSecret"]; + AuthBot.Models.AuthSettings.Scopes = ConfigurationManager.AppSettings["ActiveDirectory.Scopes"].Split(','); } } diff --git a/SampleVSOBot/Helpers/VSORestHelper.cs b/SampleVSOBot/Helpers/VSORestHelper.cs index d1bdb74..4b8a1a3 100644 --- a/SampleVSOBot/Helpers/VSORestHelper.cs +++ b/SampleVSOBot/Helpers/VSORestHelper.cs @@ -18,11 +18,10 @@ public static async Task GetWorkItems(string token) { var apiVersion = "1.0"; StringBuilder strResult = new StringBuilder(); - - var account = AuthBot.Models.AuthSettings.Tenant; + var query = "Select [System.Id] From WorkItems Where[System.WorkItemType] = 'Bug' order by [System.CreatedDate] desc"; - var url = "https://" + account + ".visualstudio.com/defaultcollection/_apis/wit/"; + var url = "https://" + AuthBot.Models.AuthSettings.Tenant + ".visualstudio.com/defaultcollection/_apis/wit/"; // Execute a query that returns work item IDs matching the specified criteria using (var request = new HttpRequestMessage(HttpMethod.Post, url + "wiql")) @@ -60,7 +59,7 @@ public static async Task GetWorkItems(string token) foreach (dynamic workItem in detailsWorkItems) { - strResult.AppendFormat("Work item: {0} ({1})", + strResult.AppendFormat("* Work item: {0} ({1})\n", workItem.fields["System.Id"], workItem.fields["System.Title"]); } @@ -71,6 +70,8 @@ public static async Task GetWorkItems(string token) } } } + + } } \ No newline at end of file diff --git a/SampleVSOBot/Web.config b/SampleVSOBot/Web.config index b44a026..591aaf6 100644 --- a/SampleVSOBot/Web.config +++ b/SampleVSOBot/Web.config @@ -12,9 +12,9 @@ - - + + From 2f335239f18ba0841ba373b5bed0899bc7400d8d Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 4 Aug 2016 11:06:19 +0100 Subject: [PATCH 12/55] Changed TokenSample to GetTokenINfo so it only shows information about the token, without requesting a new one if needed. --- SampleVSOBot/Dialogs/ActionDialog.cs | 43 ++++++++++++---------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/SampleVSOBot/Dialogs/ActionDialog.cs b/SampleVSOBot/Dialogs/ActionDialog.cs index 3457bd0..5c2fabf 100644 --- a/SampleVSOBot/Dialogs/ActionDialog.cs +++ b/SampleVSOBot/Dialogs/ActionDialog.cs @@ -22,35 +22,28 @@ public async Task StartAsync(IDialogContext context) } - public async Task TokenSample(IDialogContext context) + public async Task GetTokenInfo(IDialogContext context) { - //endpoint v1 - var accessToken = await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]); - - if (string.IsNullOrEmpty(accessToken)) - { - await context.PostAsync($"You don't have an access Token. Please logon first."); - } - else + AuthResult authResult; + if (context.UserData.TryGetValue(ContextConstants.AuthResultKey, out authResult)) { - AuthResult authResult; - if (context.UserData.TryGetValue(ContextConstants.AuthResultKey, out authResult)) - { - var expiresin= TimeSpan.FromTicks(authResult.ExpiresOnUtcTicks - DateTime.UtcNow.Ticks).TotalMinutes; - if (expiresin < 0) - { await context.PostAsync($"Your access token already expired"); } - else - { - DateTime expiredDate = new DateTime(authResult.ExpiresOnUtcTicks); - String expireDateStr = expiredDate.ToString("d/M/yyyy HH:mm:ss"); - await context.PostAsync($"Your access token expires in {expiresin} minutes ({expireDateStr})"); - await context.PostAsync($"Your access token is: {accessToken}"); - } + DateTime expiredDate = new DateTime(authResult.ExpiresOnUtcTicks); + String expireDateStr = expiredDate.ToString("d/M/yyyy HH:mm:ss"); - } - } + var expiresin= TimeSpan.FromTicks(authResult.ExpiresOnUtcTicks - DateTime.UtcNow.Ticks).TotalMinutes; + if (expiresin < 0) + { + await context.PostAsync($"Your access token already expired on {expireDateStr}"); + } + else + { + await context.PostAsync($"Your access token expires in {expiresin} minutes ({expireDateStr})"); + await context.PostAsync($"Your access token is: {authResult.AccessToken}"); + } + } + context.Wait(MessageReceivedAsync); } /// @@ -117,7 +110,7 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl } else if (message.Text == "token") { - await TokenSample(context); + await GetTokenInfo(context); } else if (message.Text == "expire") { From 621ba5d9bf1c22e3a5ab35b510ec5beab86e571e Mon Sep 17 00:00:00 2001 From: tiagonmas Date: Fri, 7 Oct 2016 11:34:58 -0700 Subject: [PATCH 13/55] Updated way to query TFS, in order to use .Net client library instead of direct HTTP Rest call --- SampleVSOBot/Dialogs/ActionDialog.cs | 74 +++++++------ SampleVSOBot/Helpers/VSORestHelper.cs | 147 ++++++++++++++++++++++++-- SampleVSOBot/SampleVSOBot.csproj | 54 ++++++++++ SampleVSOBot/default.htm | 2 +- SampleVSOBot/packages.config | 2 + 5 files changed, 236 insertions(+), 43 deletions(-) diff --git a/SampleVSOBot/Dialogs/ActionDialog.cs b/SampleVSOBot/Dialogs/ActionDialog.cs index 5c2fabf..aa7d85e 100644 --- a/SampleVSOBot/Dialogs/ActionDialog.cs +++ b/SampleVSOBot/Dialogs/ActionDialog.cs @@ -31,7 +31,7 @@ public async Task GetTokenInfo(IDialogContext context) DateTime expiredDate = new DateTime(authResult.ExpiresOnUtcTicks); String expireDateStr = expiredDate.ToString("d/M/yyyy HH:mm:ss"); - var expiresin= TimeSpan.FromTicks(authResult.ExpiresOnUtcTicks - DateTime.UtcNow.Ticks).TotalMinutes; + var expiresin = TimeSpan.FromTicks(authResult.ExpiresOnUtcTicks - DateTime.UtcNow.Ticks).TotalMinutes; if (expiresin < 0) { await context.PostAsync($"Your access token already expired on {expireDateStr}"); @@ -39,10 +39,12 @@ public async Task GetTokenInfo(IDialogContext context) else { await context.PostAsync($"Your access token expires in {expiresin} minutes ({expireDateStr})"); - await context.PostAsync($"Your access token is: {authResult.AccessToken}"); + await context.PostAsync($"Your access token starts with: \"{authResult.AccessToken.Substring(0,20)}\" and it has {authResult.AccessToken.Length} characters."); } - } + } + else + { await context.PostAsync($"Please logon first"); } context.Wait(MessageReceivedAsync); } @@ -63,33 +65,11 @@ public async Task ForceTokenExpiration(IDialogContext context) context.Wait(MessageReceivedAsync); } - public async Task GetWorkItems(IDialogContext context) - { - var accessToken = await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]); - - try - { //todo: check if token has expired - if (string.IsNullOrEmpty(accessToken)) - { - await context.PostAsync($"Please logon first"); - context.Wait(MessageReceivedAsync); - } - else - { - String witems = await VSORestHelper.GetWorkItems(accessToken); - await context.PostAsync(witems); - } - } - catch (Exception exc) - { await context.PostAsync($"Error geting work items. Error: {exc.Message}"); } - - context.Wait(MessageReceivedAsync); - } public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable item) { var message = await item; - if (message.Text == "logon") + if (message.Text.ToLower() == "logon") { //endpoint v1 if (string.IsNullOrEmpty(await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]))) @@ -102,36 +82,62 @@ public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitabl context.Wait(MessageReceivedAsync); } } - else if (message.Text == "echo") + else if (message.Text.ToLower() == "echo") { await context.PostAsync("echo"); context.Wait(this.MessageReceivedAsync); } - else if (message.Text == "token") + else if (message.Text.ToLower() == "token") { await GetTokenInfo(context); } - else if (message.Text == "expire") + else if (message.Text.ToLower() == "expire") { await ForceTokenExpiration(context); } - else if (message.Text == "logout") + else if (message.Text.ToLower() == "logout") { await context.Logout(); context.Wait(this.MessageReceivedAsync); } - else if (message.Text == "work") + else if (message.Text.ToLower() == "projects") { - await GetWorkItems(context); + await GetVSOProjectList(context); } else { - await context.PostAsync("say what ? Please say something like logon, logout, token, echo or work"); + await context.PostAsync("say what ? Please say something like logon, logout, token, echo or projects"); context.Wait(MessageReceivedAsync); } } - + + + public async Task GetVSOProjectList(IDialogContext context) + { + var accessToken = await context.GetAccessToken(ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"]); + + try + { //todo: check if token has expired + if (string.IsNullOrEmpty(accessToken)) + { + await context.PostAsync("Please logon first"); + context.Wait(MessageReceivedAsync); + } + else + { + //String witems = await VSORestHelper.GetWorkItems(accessToken); + //String witems = await VSORestHelper.QueryWorkItems_Query(accessToken); + //String witems = await VSORestHelper.QueryWorkItems_Wiql(accessToken); + String witems = await VSORestHelper.ListProjects(accessToken); + await context.PostAsync(witems); + } + } + catch (Exception exc) + { await context.PostAsync($"Error geting work items. Error:\n {exc.Message}"); } + + context.Wait(MessageReceivedAsync); + } private async Task ResumeAfterAuth(IDialogContext context, IAwaitable result) { var message = await result; diff --git a/SampleVSOBot/Helpers/VSORestHelper.cs b/SampleVSOBot/Helpers/VSORestHelper.cs index 4b8a1a3..7489f98 100644 --- a/SampleVSOBot/Helpers/VSORestHelper.cs +++ b/SampleVSOBot/Helpers/VSORestHelper.cs @@ -1,17 +1,40 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System; +using System; using System.Collections.Generic; using System.Linq; -using System.Net.Http; using System.Text; using System.Threading.Tasks; -using System.Web; +using Microsoft.TeamFoundation.Core.WebApi; +using Microsoft.VisualStudio.Services.Common; + namespace SampleVSOBot.Helpers { public static class VSORestHelper { + public static async Task ListProjects(string token) + { + StringBuilder retStr = new StringBuilder(); + + retStr.AppendLine("Fetching project list\n"); + Uri uri = new Uri("https://" + AuthBot.Models.AuthSettings.Tenant + ".visualstudio.com/"); + VssBasicCredential credentials = new VssBasicCredential("", token); + + using (ProjectHttpClient projectHttpClient = new ProjectHttpClient(uri, credentials)) + { + + IEnumerable projects = projectHttpClient.GetProjects().Result; + retStr.AppendLine(String.Format("Found {0} Projects:\n", projects.Count())); + foreach (TeamProjectReference project in projects) + { + retStr.AppendLine(String.Format("{0}\n", project.Name)); + } + + } + return retStr.ToString(); + } + + //Other sample ways to query TFS + /* public static async Task GetWorkItems(string token) { using (var client = new HttpClient()) @@ -19,12 +42,19 @@ public static async Task GetWorkItems(string token) var apiVersion = "1.0"; StringBuilder strResult = new StringBuilder(); - var query = "Select [System.Id] From WorkItems Where[System.WorkItemType] = 'Bug' order by [System.CreatedDate] desc"; + var query = "Select [System.Id] From WorkItems Where [System.WorkItemType] = 'Bug' order by [System.CreatedDate] desc"; + + client.DefaultRequestHeaders.Accept.Clear(); - var url = "https://" + AuthBot.Models.AuthSettings.Tenant + ".visualstudio.com/defaultcollection/_apis/wit/"; + //var url = "https://" + AuthBot.Models.AuthSettings.Tenant + ".visualstudio.com/defaultcollection/_apis/wit/"; + //https://www.visualstudio.com/en-us/docs/integrate/get-started/rest/basics + //VERB https://{account}.VisualStudio.com/DefaultCollection/_apis[/{area}]/{resource}?api-version={version} + + var url = "https://" + AuthBot.Models.AuthSettings.Tenant + ".visualstudio.com/DefaultCollection/_apis/wit/"; + //var url = "https://" + AuthBot.Models.AuthSettings.Tenant + ".visualstudio.com/DefaultCollection/TED%20Consumer/_apis/wit/wiql"; // Execute a query that returns work item IDs matching the specified criteria - using (var request = new HttpRequestMessage(HttpMethod.Post, url + "wiql")) + using (var request = new HttpRequestMessage(HttpMethod.Post, url)) { request.Headers.Add("Authorization", "Bearer " + token); request.Headers.Add("Accept", "application/json;api-version=" + apiVersion); @@ -71,7 +101,108 @@ public static async Task GetWorkItems(string token) } } + public static async Task QueryWorkItems_Query(string token) + { + string retStr="Nothing to return"; + string _personalAccessToken = token; + Uri _uri = new Uri("https://dpeted.visualstudio.com"); + VssBasicCredential _credentials = new VssBasicCredential("", _personalAccessToken); + + string project = "TED Consumer"; + string query = "Shared Queries/FY17/All Activities"; + + using (WorkItemTrackingHttpClient workItemTrackingHttpClient = new WorkItemTrackingHttpClient(_uri, _credentials)) + { + QueryHierarchyItem queryItem; + + try + { + //get the query object based on the query name and project + queryItem = workItemTrackingHttpClient.GetQueryAsync(project, query).Result; + } + catch (Exception ex) + { + return ex.InnerException.Message; + } + + //now we have the query id, so lets execute the query and get the results + WorkItemQueryResult workItemQueryResult = workItemTrackingHttpClient.QueryByIdAsync(queryItem.Id).Result; + + //some error handling + if (workItemQueryResult != null) + { + //need to get the list of our work item id's and put them into an array + List list = new List(); + foreach (var item in workItemQueryResult.WorkItems) + { + list.Add(item.Id); + } + int[] arr = list.ToArray(); + + //build a list of the fields we want to see + string[] fields = new string[3]; + fields[0] = "System.Id"; + fields[1] = "System.Title"; + fields[2] = "System.State"; + + //var workItems = workItemTrackingHttpClient.GetWorkItemsAsync(arr, fields, workItemQueryResult.AsOf).Result; + retStr= String.Format("Found {0} items", arr.Length); + } + } + return retStr; + } + + public static async Task QueryWorkItems_Wiql(string token) + { + string _personalAccessToken = token; + Uri _uri = new Uri("https://dpeted.visualstudio.com"); + VssBasicCredential _credentials = new VssBasicCredential("", _personalAccessToken); + + //needed to scope our query to the project + string project = "TED Consumer"; + + //var query = "Select [System.Id] From WorkItems Where [System.WorkItemType] = 'Bug' order by [System.CreatedDate] desc"; + //create a wiql object and build our query + Wiql wiql = new Wiql() + { + Query = "Select [State], [Title] " + + "From WorkItems " + + "Where [Work Item Type] = 'Bug' " + + "And [System.TeamProject] = '" + project + "' " + + "And [System.State] = 'New' " + + "Order By [State] Asc, [Changed Date] Desc" + }; + + //create instance of work item tracking http client + using (WorkItemTrackingHttpClient workItemTrackingHttpClient = new WorkItemTrackingHttpClient(_uri, _credentials)) + { + //execute the query to get the list of work items in teh results + WorkItemQueryResult workItemQueryResult = workItemTrackingHttpClient.QueryByWiqlAsync(wiql).Result; + + //some error handling + if (workItemQueryResult != null) + { + //need to get the list of our work item id's and put them into an array + List list = new List(); + foreach (var item in workItemQueryResult.WorkItems) + { + list.Add(item.Id); + } + int[] arr = list.ToArray(); + + //build a list of the fields we want to see + string[] fields = new string[3]; + fields[0] = "System.Id"; + fields[1] = "System.Title"; + fields[2] = "System.State"; + + var workItems = workItemTrackingHttpClient.GetWorkItemsAsync(arr, fields, workItemQueryResult.AsOf).Result; + } + } + return "done"; + } + */ } } \ No newline at end of file diff --git a/SampleVSOBot/SampleVSOBot.csproj b/SampleVSOBot/SampleVSOBot.csproj index e388b17..8aa60cf 100644 --- a/SampleVSOBot/SampleVSOBot.csproj +++ b/SampleVSOBot/SampleVSOBot.csproj @@ -98,6 +98,58 @@ ..\packages\Microsoft.Rest.ClientRuntime.1.8.2\lib\net45\Microsoft.Rest.ClientRuntime.dll True + + ..\packages\Microsoft.TeamFoundationServer.Client.15.106.0-preview\lib\net45\Microsoft.TeamFoundation.Build2.WebApi.dll + True + + + ..\packages\Microsoft.TeamFoundationServer.Client.15.106.0-preview\lib\net45\Microsoft.TeamFoundation.Chat.WebApi.dll + True + + + ..\packages\Microsoft.VisualStudio.Services.Client.15.106.0-preview\lib\net45\Microsoft.TeamFoundation.Common.dll + True + + + ..\packages\Microsoft.TeamFoundationServer.Client.15.106.0-preview\lib\net45\Microsoft.TeamFoundation.Core.WebApi.dll + True + + + ..\packages\Microsoft.TeamFoundationServer.Client.15.106.0-preview\lib\net45\Microsoft.TeamFoundation.DistributedTask.Common.Contracts.dll + True + + + ..\packages\Microsoft.TeamFoundationServer.Client.15.106.0-preview\lib\net45\Microsoft.TeamFoundation.Policy.WebApi.dll + True + + + ..\packages\Microsoft.TeamFoundationServer.Client.15.106.0-preview\lib\net45\Microsoft.TeamFoundation.SourceControl.WebApi.dll + True + + + ..\packages\Microsoft.TeamFoundationServer.Client.15.106.0-preview\lib\net45\Microsoft.TeamFoundation.Test.WebApi.dll + True + + + ..\packages\Microsoft.TeamFoundationServer.Client.15.106.0-preview\lib\net45\Microsoft.TeamFoundation.TestManagement.WebApi.dll + True + + + ..\packages\Microsoft.TeamFoundationServer.Client.15.106.0-preview\lib\net45\Microsoft.TeamFoundation.Work.WebApi.dll + True + + + ..\packages\Microsoft.TeamFoundationServer.Client.15.106.0-preview\lib\net45\Microsoft.TeamFoundation.WorkItemTracking.WebApi.dll + True + + + ..\packages\Microsoft.VisualStudio.Services.Client.15.106.0-preview\lib\net45\Microsoft.VisualStudio.Services.Common.dll + True + + + ..\packages\Microsoft.VisualStudio.Services.Client.15.106.0-preview\lib\net45\Microsoft.VisualStudio.Services.WebApi.dll + True + ..\packages\Microsoft.Win32.Primitives.4.0.1\lib\net46\Microsoft.Win32.Primitives.dll True @@ -148,6 +200,7 @@ ..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net46\System.Security.Cryptography.X509Certificates.dll True + @@ -193,6 +246,7 @@ Designer + Web.config diff --git a/SampleVSOBot/default.htm b/SampleVSOBot/default.htm index c4559c2..74157bc 100644 --- a/SampleVSOBot/default.htm +++ b/SampleVSOBot/default.htm @@ -5,7 +5,7 @@ -

Sample VSO Bot (1.1)

+

Sample VSO Bot (1.1a)

diff --git a/SampleVSOBot/packages.config b/SampleVSOBot/packages.config index e7b748c..a2a0fa2 100644 --- a/SampleVSOBot/packages.config +++ b/SampleVSOBot/packages.config @@ -17,6 +17,8 @@ + + From a928d6ac58baf3b00d06a08adc15a7e1929e18b2 Mon Sep 17 00:00:00 2001 From: tiagonmas Date: Fri, 7 Oct 2016 14:17:28 -0700 Subject: [PATCH 14/55] Merging with MatV main rep --- AuthBot/AuthBot.csproj | 12 ++++++------ AuthBot/packages.config | 2 +- SampleVSOBot/SampleVSOBot.csproj | 12 ++++++------ SampleVSOBot/packages.config | 5 ++--- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/AuthBot/AuthBot.csproj b/AuthBot/AuthBot.csproj index c850f63..4533927 100644 --- a/AuthBot/AuthBot.csproj +++ b/AuthBot/AuthBot.csproj @@ -39,12 +39,12 @@ ..\packages\Chronic.Signed.0.3.2\lib\net40\Chronic.dll True
- - ..\packages\Microsoft.Bot.Builder.3.1.0\lib\net46\Microsoft.Bot.Builder.dll + + ..\packages\Microsoft.Bot.Builder.3.2.0\lib\net46\Microsoft.Bot.Builder.dll True - - ..\packages\Microsoft.Bot.Builder.3.1.0\lib\net46\Microsoft.Bot.Connector.dll + + ..\packages\Microsoft.Bot.Builder.3.2.0\lib\net46\Microsoft.Bot.Connector.dll True @@ -75,8 +75,8 @@ ..\packages\Microsoft.IdentityModel.Tokens.5.0.0\lib\net451\Microsoft.IdentityModel.Tokens.dll True - - ..\packages\Microsoft.Rest.ClientRuntime.1.8.2\lib\net45\Microsoft.Rest.ClientRuntime.dll + + ..\packages\Microsoft.Rest.ClientRuntime.2.3.2\lib\net45\Microsoft.Rest.ClientRuntime.dll True diff --git a/AuthBot/packages.config b/AuthBot/packages.config index 51f4e03..9ffcb91 100644 --- a/AuthBot/packages.config +++ b/AuthBot/packages.config @@ -13,7 +13,7 @@ - + diff --git a/SampleVSOBot/SampleVSOBot.csproj b/SampleVSOBot/SampleVSOBot.csproj index 8aa60cf..248d604 100644 --- a/SampleVSOBot/SampleVSOBot.csproj +++ b/SampleVSOBot/SampleVSOBot.csproj @@ -53,12 +53,12 @@ ..\packages\Chronic.Signed.0.3.2\lib\net40\Chronic.dll True - - ..\packages\Microsoft.Bot.Builder.3.0.1\lib\net46\Microsoft.Bot.Builder.dll + + ..\packages\Microsoft.Bot.Builder.3.2.0\lib\net46\Microsoft.Bot.Builder.dll True - - ..\packages\Microsoft.Bot.Builder.3.0.1\lib\net46\Microsoft.Bot.Connector.dll + + ..\packages\Microsoft.Bot.Builder.3.2.0\lib\net46\Microsoft.Bot.Connector.dll True @@ -94,8 +94,8 @@ ..\packages\Microsoft.IdentityModel.Tokens.5.0.0\lib\net451\Microsoft.IdentityModel.Tokens.dll True - - ..\packages\Microsoft.Rest.ClientRuntime.1.8.2\lib\net45\Microsoft.Rest.ClientRuntime.dll + + ..\packages\Microsoft.Rest.ClientRuntime.2.3.2\lib\net45\Microsoft.Rest.ClientRuntime.dll True diff --git a/SampleVSOBot/packages.config b/SampleVSOBot/packages.config index a2a0fa2..30d21eb 100644 --- a/SampleVSOBot/packages.config +++ b/SampleVSOBot/packages.config @@ -1,6 +1,5 @@  - @@ -8,7 +7,7 @@ - + @@ -16,7 +15,7 @@ - + From 5c9ee40ff45e22359555dd6f9d8875d735d80b99 Mon Sep 17 00:00:00 2001 From: tiagonmas Date: Fri, 7 Oct 2016 15:11:57 -0700 Subject: [PATCH 15/55] merging with Matt --- AuthBot/Dialogs/AzureAuthDialog.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AuthBot/Dialogs/AzureAuthDialog.cs b/AuthBot/Dialogs/AzureAuthDialog.cs index b0312b6..27aaf94 100644 --- a/AuthBot/Dialogs/AzureAuthDialog.cs +++ b/AuthBot/Dialogs/AzureAuthDialog.cs @@ -109,7 +109,7 @@ private async Task LogIn(IDialogContext context, IMessageActivity msg, string[] else { authenticationUrl = await AzureActiveDirectoryHelper.GetAuthUrlAsync(resumptionCookie, scopes); } - if (msg.ChannelId == "skype" ) + if (msg.ChannelId == "skype" && !string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) { IMessageActivity response = context.MakeMessage(); response.Recipient = msg.From; From 8303bbab37d631680a4621a3538a4a0ba10d88ef Mon Sep 17 00:00:00 2001 From: tiagonmas Date: Fri, 7 Oct 2016 15:21:58 -0700 Subject: [PATCH 16/55] Revert "merging with Matt" This reverts commit 5c9ee40ff45e22359555dd6f9d8875d735d80b99. --- AuthBot/Dialogs/AzureAuthDialog.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AuthBot/Dialogs/AzureAuthDialog.cs b/AuthBot/Dialogs/AzureAuthDialog.cs index 27aaf94..b0312b6 100644 --- a/AuthBot/Dialogs/AzureAuthDialog.cs +++ b/AuthBot/Dialogs/AzureAuthDialog.cs @@ -109,7 +109,7 @@ private async Task LogIn(IDialogContext context, IMessageActivity msg, string[] else { authenticationUrl = await AzureActiveDirectoryHelper.GetAuthUrlAsync(resumptionCookie, scopes); } - if (msg.ChannelId == "skype" && !string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) + if (msg.ChannelId == "skype" ) { IMessageActivity response = context.MakeMessage(); response.Recipient = msg.From; From ee9b7b837726eae707a3c1f22430ca19f57d7ed9 Mon Sep 17 00:00:00 2001 From: tiagonmas Date: Tue, 11 Oct 2016 15:20:55 -0700 Subject: [PATCH 17/55] sorting dependencies issues after mergint with Mat --- AuthBot.sln | 1 - AuthBot/AuthBot.csproj | 27 ++--- .../Controllers/OAuthCallbackController.cs | 7 +- AuthBot/Dialogs/AzureAuthDialog.cs | 2 +- AuthBot/app.config | 2 +- AuthBot/packages.config | 6 +- OneDriveBot/OneDriveBot.csproj | 22 ++-- OneDriveBot/Web.config | 18 ++- OneDriveBot/packages.config | 8 +- SampleAADv1Bot/SampleAADv1Bot.csproj | 26 ++--- SampleAADv1Bot/Web.config | 18 ++- SampleAADv1Bot/packages.config | 10 +- SampleAADv2Bot/SampleAADv2Bot.csproj | 34 ++++-- SampleAADv2Bot/Web.config | 26 ++++- SampleAADv2Bot/packages.config | 12 +- SampleVSOBot/App_Start/WebApiConfig.cs | 24 ++-- SampleVSOBot/Global.asax.cs | 8 +- SampleVSOBot/SampleVSOBot.csproj | 110 ++++++++---------- SampleVSOBot/Web.Release.config | 4 + SampleVSOBot/Web.config | 109 ++++++++++------- SampleVSOBot/packages.config | 11 +- 21 files changed, 280 insertions(+), 205 deletions(-) diff --git a/AuthBot.sln b/AuthBot.sln index ff5538d..ff15743 100644 --- a/AuthBot.sln +++ b/AuthBot.sln @@ -34,7 +34,6 @@ Global {4EE65876-C3A8-4F9D-973A-42729E205F94}.Release|Any CPU.ActiveCfg = Release|Any CPU {4EE65876-C3A8-4F9D-973A-42729E205F94}.Release|Any CPU.Build.0 = Release|Any CPU {D2253234-1279-486E-8A63-D8C3424E0525}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2253234-1279-486E-8A63-D8C3424E0525}.Debug|Any CPU.Build.0 = Debug|Any CPU {D2253234-1279-486E-8A63-D8C3424E0525}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2253234-1279-486E-8A63-D8C3424E0525}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection diff --git a/AuthBot/AuthBot.csproj b/AuthBot/AuthBot.csproj index 4533927..c730d18 100644 --- a/AuthBot/AuthBot.csproj +++ b/AuthBot/AuthBot.csproj @@ -31,20 +31,20 @@ 4 - - ..\packages\Autofac.4.0.0-rc3-316\lib\net451\Autofac.dll + + ..\packages\Autofac.4.1.1\lib\net45\Autofac.dll True ..\packages\Chronic.Signed.0.3.2\lib\net40\Chronic.dll True - - ..\packages\Microsoft.Bot.Builder.3.2.0\lib\net46\Microsoft.Bot.Builder.dll + + ..\packages\Microsoft.Bot.Builder.3.2.1\lib\net46\Microsoft.Bot.Builder.dll True - - ..\packages\Microsoft.Bot.Builder.3.2.0\lib\net46\Microsoft.Bot.Connector.dll + + ..\packages\Microsoft.Bot.Builder.3.2.1\lib\net46\Microsoft.Bot.Connector.dll True @@ -55,12 +55,12 @@ ..\packages\Microsoft.Identity.Client.1.0.304142221-alpha\lib\net45\Microsoft.Identity.Client.Platform.dll True - - ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.12.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll + + ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.13.5\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll True - - ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.12.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll + + ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.13.5\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll True @@ -88,7 +88,7 @@ True - ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.9.0.2-beta1\lib\net45\Newtonsoft.Json.dll True @@ -105,11 +105,6 @@ - - ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll - True - - ..\packages\System.Runtime.Serialization.Primitives.4.1.1\lib\net46\System.Runtime.Serialization.Primitives.dll diff --git a/AuthBot/Controllers/OAuthCallbackController.cs b/AuthBot/Controllers/OAuthCallbackController.cs index 223dd28..d8ac75f 100644 --- a/AuthBot/Controllers/OAuthCallbackController.cs +++ b/AuthBot/Controllers/OAuthCallbackController.cs @@ -85,7 +85,12 @@ public async Task OAuthCallback([FromUri] string code, [Fro else if (string.Equals(AuthSettings.Mode, "b2c", StringComparison.OrdinalIgnoreCase)) { } - + else if (string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) + { + // Exchange the Auth code with Access token + authResult = await VisualStudioOnlineHelper.GetTokenByAuthCodeAsync(code); + } + IStateClient sc = scope.Resolve(); var dataBag = scope.Resolve(); diff --git a/AuthBot/Dialogs/AzureAuthDialog.cs b/AuthBot/Dialogs/AzureAuthDialog.cs index b0312b6..27aaf94 100644 --- a/AuthBot/Dialogs/AzureAuthDialog.cs +++ b/AuthBot/Dialogs/AzureAuthDialog.cs @@ -109,7 +109,7 @@ private async Task LogIn(IDialogContext context, IMessageActivity msg, string[] else { authenticationUrl = await AzureActiveDirectoryHelper.GetAuthUrlAsync(resumptionCookie, scopes); } - if (msg.ChannelId == "skype" ) + if (msg.ChannelId == "skype" && !string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) { IMessageActivity response = context.MakeMessage(); response.Recipient = msg.From; diff --git a/AuthBot/app.config b/AuthBot/app.config index ad36121..9404d2a 100644 --- a/AuthBot/app.config +++ b/AuthBot/app.config @@ -28,7 +28,7 @@ - + diff --git a/AuthBot/packages.config b/AuthBot/packages.config index 9ffcb91..7d5529a 100644 --- a/AuthBot/packages.config +++ b/AuthBot/packages.config @@ -1,13 +1,13 @@  - + - + @@ -16,7 +16,7 @@ - + diff --git a/OneDriveBot/OneDriveBot.csproj b/OneDriveBot/OneDriveBot.csproj index 74e3e91..5308520 100644 --- a/OneDriveBot/OneDriveBot.csproj +++ b/OneDriveBot/OneDriveBot.csproj @@ -46,20 +46,20 @@ ..\packages\AuthBot.3.1.1-alpha\lib\net40\AuthBot.dll True - - ..\packages\Autofac.4.0.0-rc3-316\lib\net451\Autofac.dll + + ..\packages\Autofac.4.1.1\lib\net45\Autofac.dll True ..\packages\Chronic.Signed.0.3.2\lib\net40\Chronic.dll True - - ..\packages\Microsoft.Bot.Builder.3.2.0\lib\net46\Microsoft.Bot.Builder.dll + + ..\packages\Microsoft.Bot.Builder.3.2.1\lib\net46\Microsoft.Bot.Builder.dll True - - ..\packages\Microsoft.Bot.Builder.3.2.0\lib\net46\Microsoft.Bot.Connector.dll + + ..\packages\Microsoft.Bot.Builder.3.2.1\lib\net46\Microsoft.Bot.Connector.dll True @@ -71,12 +71,12 @@ ..\packages\Microsoft.Identity.Client.1.0.304142221-alpha\lib\net45\Microsoft.Identity.Client.Platform.dll True - - ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.12.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll + + ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.13.5\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll True - - ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.12.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll + + ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.13.5\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll True @@ -104,7 +104,7 @@ True - ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.9.0.2-beta1\lib\net45\Newtonsoft.Json.dll True diff --git a/OneDriveBot/Web.config b/OneDriveBot/Web.config index dc5f927..af9082e 100644 --- a/OneDriveBot/Web.config +++ b/OneDriveBot/Web.config @@ -82,21 +82,33 @@ - + - + - + + + + + + + + + + + + + diff --git a/OneDriveBot/packages.config b/OneDriveBot/packages.config index fe366e1..031d819 100644 --- a/OneDriveBot/packages.config +++ b/OneDriveBot/packages.config @@ -1,23 +1,23 @@  - + - + - + - + diff --git a/SampleAADv1Bot/SampleAADv1Bot.csproj b/SampleAADv1Bot/SampleAADv1Bot.csproj index 9157b37..2107747 100644 --- a/SampleAADv1Bot/SampleAADv1Bot.csproj +++ b/SampleAADv1Bot/SampleAADv1Bot.csproj @@ -1,6 +1,6 @@  - + Debug @@ -49,20 +49,20 @@ ..\packages\AuthBot.3.1.1-alpha\lib\net40\AuthBot.dll True - - ..\packages\Autofac.4.0.0-rc3-316\lib\net451\Autofac.dll + + ..\packages\Autofac.4.1.1\lib\net45\Autofac.dll True ..\packages\Chronic.Signed.0.3.2\lib\net40\Chronic.dll True - - ..\packages\Microsoft.Bot.Builder.3.2.0\lib\net46\Microsoft.Bot.Builder.dll + + ..\packages\Microsoft.Bot.Builder.3.2.1\lib\net46\Microsoft.Bot.Builder.dll True - - ..\packages\Microsoft.Bot.Builder.3.2.0\lib\net46\Microsoft.Bot.Connector.dll + + ..\packages\Microsoft.Bot.Builder.3.2.1\lib\net46\Microsoft.Bot.Connector.dll True @@ -78,12 +78,12 @@ ..\packages\Microsoft.Identity.Client.1.0.304142221-alpha\lib\net45\Microsoft.Identity.Client.Platform.dll True - - ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.12.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll + + ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.13.5\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll True - - ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.12.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll + + ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.13.5\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll True @@ -111,7 +111,7 @@ True - ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.9.0.2-beta1\lib\net45\Newtonsoft.Json.dll True @@ -221,7 +221,7 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + + + + \ No newline at end of file diff --git a/SampleVSOBot/Web.config b/SampleVSOBot/Web.config index 591aaf6..fd29f7e 100644 --- a/SampleVSOBot/Web.config +++ b/SampleVSOBot/Web.config @@ -1,24 +1,32 @@ - + - - - - + + + + - - - - - - - - + + + + + + + + + + - - + + + - - + + - - - - - - - + + + + + + + + - - + + + + + + - - + + - - + + - - + + - - + + - - + + - - - + + + + - - + + - - - + + + + + + + - \ No newline at end of file + diff --git a/SampleVSOBot/packages.config b/SampleVSOBot/packages.config index 30d21eb..a91e831 100644 --- a/SampleVSOBot/packages.config +++ b/SampleVSOBot/packages.config @@ -1,13 +1,14 @@  - + + - + @@ -16,11 +17,11 @@ - - + + - + From 1809adc2efbf337a7733797a2f218dfaf55dd472 Mon Sep 17 00:00:00 2001 From: tiagonmas Date: Wed, 12 Oct 2016 14:33:16 -0700 Subject: [PATCH 18/55] final changes resulting merge with Mat repo and changes in resumptioncookie --- AuthBot/AuthBot.csproj | 1 + AuthBot/Controllers/OAuthCallbackController.cs | 10 +++++++++- AuthBot/Helpers/VisualStudioOnlineHelper.cs | 10 ++++++---- SampleVSOBot/Helpers/VSORestHelper.cs | 12 ++++++++---- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/AuthBot/AuthBot.csproj b/AuthBot/AuthBot.csproj index c730d18..1332eec 100644 --- a/AuthBot/AuthBot.csproj +++ b/AuthBot/AuthBot.csproj @@ -127,6 +127,7 @@ True + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll True diff --git a/AuthBot/Controllers/OAuthCallbackController.cs b/AuthBot/Controllers/OAuthCallbackController.cs index d1c645b..956e5fc 100644 --- a/AuthBot/Controllers/OAuthCallbackController.cs +++ b/AuthBot/Controllers/OAuthCallbackController.cs @@ -72,8 +72,10 @@ public async Task OAuthCallback( { } + // Get the resumption cookie var resumptionCookie = new ResumptionCookie(queryParams["userId"], queryParams["botId"], queryParams["conversationId"], queryParams["channelId"], queryParams["serviceUrl"], queryParams["locale"]); + // Create the message that is send to conversation to resume the login flow var message = resumptionCookie.GetMessage(); @@ -96,7 +98,13 @@ public async Task OAuthCallback( else if (string.Equals(AuthSettings.Mode, "b2c", StringComparison.OrdinalIgnoreCase)) { } - + else if (string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) + { + // Exchange the Auth code with Access token + authResult = await VisualStudioOnlineHelper.GetTokenByAuthCodeAsync(code); + } + + IStateClient sc = scope.Resolve(); //IMPORTANT: DO NOT REMOVE THE MAGIC NUMBER CHECK THAT WE DO HERE. THIS IS AN ABSOLUTE SECURITY REQUIREMENT diff --git a/AuthBot/Helpers/VisualStudioOnlineHelper.cs b/AuthBot/Helpers/VisualStudioOnlineHelper.cs index fab7e5f..8c96d5e 100644 --- a/AuthBot/Helpers/VisualStudioOnlineHelper.cs +++ b/AuthBot/Helpers/VisualStudioOnlineHelper.cs @@ -12,15 +12,18 @@ using System.Threading.Tasks; using System.Web; + namespace AuthBot.Helpers { class VisualStudioOnlineHelper { public static string GetAuthUrlAsync(ResumptionCookie resumptionCookie) { - //To Do Change Tenant to Scope - var encodedCookie = Microsoft.Bot.Builder.Dialogs.UrlToken.Encode(resumptionCookie); - var scopes = String.Join(",", AuthSettings.Scopes); + + var resumptionCookieAsParams = String.Format("userId={0}&botId={1}&conversationId={2}&channelId={3}&serviceUrl={4}&locale={5}", resumptionCookie.Address.UserId,resumptionCookie.Address.BotId, resumptionCookie.Address.ConversationId, resumptionCookie.Address.ChannelId, resumptionCookie.Address.ServiceUrl, resumptionCookie.Locale); + var encodedCookie = HttpServerUtility.UrlTokenEncode(Encoding.UTF8.GetBytes(resumptionCookieAsParams)); + + var scopes = String.Join(",", AuthSettings.Scopes); return String.Format("{0}/oauth2/authorize?client_id={1}&response_type=Assertion&state={2}&scope={3}&redirect_uri={4}", AuthSettings.EndpointUrl, AuthSettings.ClientId, encodedCookie, scopes, AuthSettings.RedirectUrl); } public static async Task GetTokenByAuthCodeAsync(string authorizationCode) @@ -102,6 +105,5 @@ public static bool IsTokenExpired(long _expiresOnUtcTicks) { } - } } diff --git a/SampleVSOBot/Helpers/VSORestHelper.cs b/SampleVSOBot/Helpers/VSORestHelper.cs index 7489f98..06b372a 100644 --- a/SampleVSOBot/Helpers/VSORestHelper.cs +++ b/SampleVSOBot/Helpers/VSORestHelper.cs @@ -5,7 +5,11 @@ using System.Threading.Tasks; using Microsoft.TeamFoundation.Core.WebApi; using Microsoft.VisualStudio.Services.Common; - +using System.Net.Http; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Microsoft.TeamFoundation.WorkItemTracking.WebApi; +using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models; namespace SampleVSOBot.Helpers { @@ -33,8 +37,8 @@ public static async Task ListProjects(string token) return retStr.ToString(); } - //Other sample ways to query TFS - /* + #region Other sample ways to query TFS + public static async Task GetWorkItems(string token) { using (var client = new HttpClient()) @@ -202,7 +206,7 @@ public static async Task QueryWorkItems_Wiql(string token) return "done"; } - */ + #endregion } } \ No newline at end of file From 5196fe9a956e877a4cc93d0151871af89ca16d9b Mon Sep 17 00:00:00 2001 From: tiagonmas Date: Wed, 12 Oct 2016 22:54:01 -0700 Subject: [PATCH 19/55] Merged with Mat and listinf projects from TFS. Skype sigin too. --- AuthBot/Dialogs/AzureAuthDialog.cs | 6 ++++-- SampleAADv2Bot/Web.config | 6 +++--- SampleVSOBot/Dialogs/ActionDialog.cs | 2 +- SampleVSOBot/Helpers/VSORestHelper.cs | 10 ++++++---- SampleVSOBot/Web.config | 9 --------- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/AuthBot/Dialogs/AzureAuthDialog.cs b/AuthBot/Dialogs/AzureAuthDialog.cs index 27aaf94..4c7e76e 100644 --- a/AuthBot/Dialogs/AzureAuthDialog.cs +++ b/AuthBot/Dialogs/AzureAuthDialog.cs @@ -18,9 +18,10 @@ public class AzureAuthDialog : IDialog private string[] scopes; private string prompt; - public AzureAuthDialog(string resourceId) + public AzureAuthDialog(string resourceId, string prompt = "Please click to sign in: ") { this.resourceId = resourceId; + this.prompt = prompt; } public AzureAuthDialog(string[] scopes,string prompt="Please click to sign in: ") { @@ -109,7 +110,8 @@ private async Task LogIn(IDialogContext context, IMessageActivity msg, string[] else { authenticationUrl = await AzureActiveDirectoryHelper.GetAuthUrlAsync(resumptionCookie, scopes); } - if (msg.ChannelId == "skype" && !string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) + //if (msg.ChannelId == "skype" && !string.Equals(AuthSettings.Mode, "vso", StringComparison.OrdinalIgnoreCase)) + if (msg.ChannelId == "skype" || msg.ChannelId == "emulator") { IMessageActivity response = context.MakeMessage(); response.Recipient = msg.From; diff --git a/SampleAADv2Bot/Web.config b/SampleAADv2Bot/Web.config index 87a94db..d27465f 100644 --- a/SampleAADv2Bot/Web.config +++ b/SampleAADv2Bot/Web.config @@ -6,9 +6,9 @@ - - - + + + diff --git a/SampleVSOBot/Dialogs/ActionDialog.cs b/SampleVSOBot/Dialogs/ActionDialog.cs index d25d693..b09ca53 100644 --- a/SampleVSOBot/Dialogs/ActionDialog.cs +++ b/SampleVSOBot/Dialogs/ActionDialog.cs @@ -39,7 +39,7 @@ public async Task GetTokenInfo(IDialogContext context) else { await context.PostAsync($"Your access token expires in {expiresin} minutes ({expireDateStr})"); - await context.PostAsync($"Your access token starts with \"{authResult.AccessToken.Substring(0,20)}\" and it has {authResult.AccessToken.Length} characters."); + await context.PostAsync($"Your access token is \"{authResult.AccessToken}\"."); } } diff --git a/SampleVSOBot/Helpers/VSORestHelper.cs b/SampleVSOBot/Helpers/VSORestHelper.cs index 06b372a..a7d7698 100644 --- a/SampleVSOBot/Helpers/VSORestHelper.cs +++ b/SampleVSOBot/Helpers/VSORestHelper.cs @@ -105,17 +105,18 @@ public static async Task GetWorkItems(string token) } } + public static async Task QueryWorkItems_Query(string token) { string retStr="Nothing to return"; string _personalAccessToken = token; - Uri _uri = new Uri("https://dpeted.visualstudio.com"); + Uri uri = new Uri("https://" + AuthBot.Models.AuthSettings.Tenant + ".visualstudio.com/"); VssBasicCredential _credentials = new VssBasicCredential("", _personalAccessToken); string project = "TED Consumer"; string query = "Shared Queries/FY17/All Activities"; - using (WorkItemTrackingHttpClient workItemTrackingHttpClient = new WorkItemTrackingHttpClient(_uri, _credentials)) + using (WorkItemTrackingHttpClient workItemTrackingHttpClient = new WorkItemTrackingHttpClient(uri, _credentials)) { QueryHierarchyItem queryItem; @@ -155,11 +156,12 @@ public static async Task QueryWorkItems_Query(string token) } return retStr; } + public static async Task QueryWorkItems_Wiql(string token) { string _personalAccessToken = token; - Uri _uri = new Uri("https://dpeted.visualstudio.com"); + Uri uri = new Uri("https://" + AuthBot.Models.AuthSettings.Tenant + ".visualstudio.com/"); VssBasicCredential _credentials = new VssBasicCredential("", _personalAccessToken); //needed to scope our query to the project @@ -178,7 +180,7 @@ public static async Task QueryWorkItems_Wiql(string token) }; //create instance of work item tracking http client - using (WorkItemTrackingHttpClient workItemTrackingHttpClient = new WorkItemTrackingHttpClient(_uri, _credentials)) + using (WorkItemTrackingHttpClient workItemTrackingHttpClient = new WorkItemTrackingHttpClient(uri, _credentials)) { //execute the query to get the list of work items in teh results WorkItemQueryResult workItemQueryResult = workItemTrackingHttpClient.QueryByWiqlAsync(wiql).Result; diff --git a/SampleVSOBot/Web.config b/SampleVSOBot/Web.config index fd29f7e..a397c50 100644 --- a/SampleVSOBot/Web.config +++ b/SampleVSOBot/Web.config @@ -10,15 +10,6 @@ - - - From 9ff0182781028249e68079802643a7b7b4a87409 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:27:07 -0700 Subject: [PATCH 20/55] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index e314680..4b4d57b 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,15 @@ B2C enables users to sign up to your AAD tenant using external identity provider This model is not yet supported by this library. We're working on it. +### Visual Studio Online (VSO): +Visual Studio Online (http://www.visualstudio.com). +To authenticate with VSO you´ll need: + +1. You will register an application in https://app.vsaex.visualstudio.com/app/register. Unfortunatly currently you cannot specify localhost as the Authorization Callback URL. So you'll not be able to fully test the authentication flow with Bot Emulator. You will need to deploy to a site other than localhost. +2. During registration, you will select the scopes that your application needs. The application code itself will request for specific permissions in runtime and it needs to be a subset of the scopes defined in the registration process. The scopes are defined at logon time. +3. Look at SampleVSOBot project. Configure the area with your settings. +4. Check here for more details. + ### Tips with setup Regardless of whether you use endpoints v1 or v2, once you register your application you need to set the redirect URI to /api/OAuthCallback. For example, if your bot will run on http://localhost:1234, then the redirect URI will have to be http://localhost:1234/api/OAuthCallback. This ensures that once the user finishes the login, your bot will become aware of it. From 280254f2f14d72e3840120c1ab03e14010835243 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:28:16 -0700 Subject: [PATCH 21/55] Create SampleVSOBot.md --- SampleVSOBot.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 SampleVSOBot.md diff --git a/SampleVSOBot.md b/SampleVSOBot.md new file mode 100644 index 0000000..a31fe93 --- /dev/null +++ b/SampleVSOBot.md @@ -0,0 +1,4 @@ +#Mode details about authenticating with Visual Studio Online +##Configuring web.config + +## VSO oAuth flow From a7599427d4a2e0fdc2d5ef9cb86a8840061a398f Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:42:32 -0700 Subject: [PATCH 22/55] Update SampleVSOBot.md --- SampleVSOBot.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index a31fe93..777c450 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -1,4 +1,6 @@ -#Mode details about authenticating with Visual Studio Online +#Using Authbot to authenticate in Visual Studio Online ##Configuring web.config +##Bot in action + ## VSO oAuth flow From 47b090a52c475726913188efb805205d6b07e946 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:43:01 -0700 Subject: [PATCH 23/55] Picture of VSO Sample Bot in action --- VSOBotCapture.PNG | Bin 0 -> 39236 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 VSOBotCapture.PNG diff --git a/VSOBotCapture.PNG b/VSOBotCapture.PNG new file mode 100644 index 0000000000000000000000000000000000000000..1aea0eb72769a1dcd0982cc5a60a664d30739743 GIT binary patch literal 39236 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 m@Ar-*)UA$*SdQBO3r07#Qy_9mnrlB literal 0 HcmV?d00001 From 7138dc0f93a58c04c46f356d99f76b32908b52b4 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:45:05 -0700 Subject: [PATCH 24/55] Update SampleVSOBot.md --- SampleVSOBot.md | 1 + 1 file changed, 1 insertion(+) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 777c450..4a912a0 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -2,5 +2,6 @@ ##Configuring web.config ##Bot in action +![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/blob/master/VSOBotCapture.PNG) ## VSO oAuth flow From 689dd0b43dc7b2da87c06054504da516ff20511e Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:45:23 -0700 Subject: [PATCH 25/55] Add files via upload --- VSOBotCapture.PNG | Bin 39236 -> 36090 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/VSOBotCapture.PNG b/VSOBotCapture.PNG index 1aea0eb72769a1dcd0982cc5a60a664d30739743..f88f217139292786adb9c7d36d36564097a42b29 100644 GIT binary patch literal 36090 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 literal 39236 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 m@Ar-*)UA$*SdQBO3r07#Qy_9mnrlB From f5e1e2536b08d7d5aa8e29445b33375eeb592ba4 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:45:53 -0700 Subject: [PATCH 26/55] Delete VSOBotCapture.PNG --- VSOBotCapture.PNG | Bin 36090 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 VSOBotCapture.PNG diff --git a/VSOBotCapture.PNG b/VSOBotCapture.PNG deleted file mode 100644 index f88f217139292786adb9c7d36d36564097a42b29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36090 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 From 76d6d5b05f7b387c5934dc7981d897b98b134103 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:46:02 -0700 Subject: [PATCH 27/55] Add files via upload --- VSOBotCapture.PNG | Bin 0 -> 36090 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 VSOBotCapture.PNG diff --git a/VSOBotCapture.PNG b/VSOBotCapture.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f88f217139292786adb9c7d36d36564097a42b29 GIT binary patch literal 36090 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 literal 0 HcmV?d00001 From 1904444e9cd881dd7cd15b9cebb80e7477049966 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:46:48 -0700 Subject: [PATCH 28/55] deleting image --- VSOBotCapture.PNG | Bin 36090 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 VSOBotCapture.PNG diff --git a/VSOBotCapture.PNG b/VSOBotCapture.PNG deleted file mode 100644 index f88f217139292786adb9c7d36d36564097a42b29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36090 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 From 6dd3f34a7c2b3f6a3d76b202bfd71be60f8b05d9 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:47:09 -0700 Subject: [PATCH 29/55] Add files via upload --- VSOBotSampeInAction.PNG | Bin 0 -> 36090 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 VSOBotSampeInAction.PNG diff --git a/VSOBotSampeInAction.PNG b/VSOBotSampeInAction.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f88f217139292786adb9c7d36d36564097a42b29 GIT binary patch literal 36090 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 literal 0 HcmV?d00001 From dcf0428999f16718e82a9ad47d0a597b8d855b10 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:50:29 -0700 Subject: [PATCH 30/55] Update SampleVSOBot.md --- SampleVSOBot.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 4a912a0..32ece5b 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -2,6 +2,12 @@ ##Configuring web.config ##Bot in action -![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/blob/master/VSOBotCapture.PNG) +![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/VSOBotSampeInAction.PNG = 250x250) ## VSO oAuth flow + +##Relevant links +https://app.vsaex.visualstudio.com/ +https://app.vsaex.visualstudio.com/app/register +Authorize access to REST APIs with OAuth 2.0 +https://www.visualstudio.com/docs/integrate/get-started/auth/oauth From 079777c7ddaf00f1024e787bd2cc28e5c2d6f797 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:50:39 -0700 Subject: [PATCH 31/55] Update SampleVSOBot.md --- SampleVSOBot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 32ece5b..92ce12c 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -2,7 +2,7 @@ ##Configuring web.config ##Bot in action -![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/VSOBotSampeInAction.PNG = 250x250) +![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/VSOBotSampeInAction.PNG) ## VSO oAuth flow From fa253e194de1459073293d0c7dd5af3968c1aa5f Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:51:06 -0700 Subject: [PATCH 32/55] Update SampleVSOBot.md --- SampleVSOBot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 92ce12c..3e0dd38 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -2,7 +2,7 @@ ##Configuring web.config ##Bot in action -![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/VSOBotSampeInAction.PNG) +![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/blob/master/VSOBotSampeInAction.PNG) ## VSO oAuth flow From eab70f3b3c4fb36e273647700cfa0bf9f4e33d4e Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:51:16 -0700 Subject: [PATCH 33/55] Update SampleVSOBot.md --- SampleVSOBot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 3e0dd38..4726060 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -2,7 +2,7 @@ ##Configuring web.config ##Bot in action -![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/blob/master/VSOBotSampeInAction.PNG) +![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/blob/master/VSOBotSampeInAction.PNG = 250x250) ## VSO oAuth flow From 3e519dc358b3bb2fb6a945ae6cfed8a17ba876fa Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:51:33 -0700 Subject: [PATCH 34/55] Update SampleVSOBot.md --- SampleVSOBot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 4726060..dca8141 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -2,7 +2,7 @@ ##Configuring web.config ##Bot in action -![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/blob/master/VSOBotSampeInAction.PNG = 250x250) +![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/blob/master/VSOBotSampeInAction.PNG {width=40px height=400px}) ## VSO oAuth flow From 082556ccc68d076008af679d930708b078c2e297 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:51:44 -0700 Subject: [PATCH 35/55] Update SampleVSOBot.md --- SampleVSOBot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index dca8141..3e0dd38 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -2,7 +2,7 @@ ##Configuring web.config ##Bot in action -![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/blob/master/VSOBotSampeInAction.PNG {width=40px height=400px}) +![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/blob/master/VSOBotSampeInAction.PNG) ## VSO oAuth flow From dc862eae4229992576975ca2ee11250c305f28d9 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:52:16 -0700 Subject: [PATCH 36/55] Update SampleVSOBot.md --- SampleVSOBot.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 3e0dd38..47c86c3 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -2,7 +2,8 @@ ##Configuring web.config ##Bot in action -![Picture of VSO Sample bot in action](https://github.com/tiagonmas/AuthBot/blob/master/VSOBotSampeInAction.PNG) + + ## VSO oAuth flow From d75650136df12a817d7a940272afc7476b3e6c0b Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:52:34 -0700 Subject: [PATCH 37/55] Update SampleVSOBot.md --- SampleVSOBot.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 47c86c3..67622f2 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -2,8 +2,7 @@ ##Configuring web.config ##Bot in action - - + ## VSO oAuth flow From 925afabafab4c1bbb2eb6bddc5854e26e2234909 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:56:16 -0700 Subject: [PATCH 38/55] Update SampleVSOBot.md --- SampleVSOBot.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 67622f2..18dce02 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -1,6 +1,22 @@ #Using Authbot to authenticate in Visual Studio Online ##Configuring web.config +```xml + + + + + + + + + + + + + + +```xml ##Bot in action From c882b897beb4ec6c14a89825973a4ce7d876347b Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:56:31 -0700 Subject: [PATCH 39/55] Update SampleVSOBot.md --- SampleVSOBot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 18dce02..2f3e9b2 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -16,7 +16,7 @@ -```xml +``` ##Bot in action From 121f17639b55f071c2096522895269d2281b67ad Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:57:09 -0700 Subject: [PATCH 40/55] Update SampleVSOBot.md --- SampleVSOBot.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 2f3e9b2..487cd14 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -1,4 +1,9 @@ #Using Authbot to authenticate in Visual Studio Online +Here are more details about VSO authentication with Authbot + +##Bot in action + + ##Configuring web.config ```xml @@ -17,8 +22,6 @@ ``` -##Bot in action - ## VSO oAuth flow From 8b1145eaacb05551d2a95ba3defeec1081a02bd2 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:58:10 -0700 Subject: [PATCH 41/55] Add files via upload --- VSOFlow.PNG | Bin 0 -> 61283 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 VSOFlow.PNG diff --git a/VSOFlow.PNG b/VSOFlow.PNG new file mode 100644 index 0000000000000000000000000000000000000000..50f0dcabb925131819344d6f5d43698cad30fa10 GIT binary patch literal 61283 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 Date: Thu, 13 Oct 2016 10:58:58 -0700 Subject: [PATCH 42/55] Update SampleVSOBot.md --- SampleVSOBot.md | 1 + 1 file changed, 1 insertion(+) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 487cd14..9513108 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -24,6 +24,7 @@ Here are more details about VSO authentication with Authbot ``` ## VSO oAuth flow + ##Relevant links https://app.vsaex.visualstudio.com/ From d53109b31c515caaa2c6ccb5acd480fd14f7b920 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:59:18 -0700 Subject: [PATCH 43/55] Update SampleVSOBot.md --- SampleVSOBot.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 9513108..df72958 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -2,7 +2,7 @@ Here are more details about VSO authentication with Authbot ##Bot in action - + ##Configuring web.config ```xml @@ -24,7 +24,7 @@ Here are more details about VSO authentication with Authbot ``` ## VSO oAuth flow - + ##Relevant links https://app.vsaex.visualstudio.com/ From e804ef7a908da19ddd07440cddab1643d8536530 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 10:59:55 -0700 Subject: [PATCH 44/55] Update SampleVSOBot.md --- SampleVSOBot.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index df72958..a522ee5 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -2,7 +2,7 @@ Here are more details about VSO authentication with Authbot ##Bot in action - + ##Configuring web.config ```xml @@ -24,10 +24,9 @@ Here are more details about VSO authentication with Authbot ``` ## VSO oAuth flow - + ##Relevant links -https://app.vsaex.visualstudio.com/ -https://app.vsaex.visualstudio.com/app/register -Authorize access to REST APIs with OAuth 2.0 -https://www.visualstudio.com/docs/integrate/get-started/auth/oauth +###https://app.vsaex.visualstudio.com/ +###https://app.vsaex.visualstudio.com/app/register +###[Authorize access to REST APIs with OAuth 2.0](https://www.visualstudio.com/docs/integrate/get-started/auth/oauth) From c38ad3c74f1b3208b727d9d5ad1eea36fa49cc54 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 11:03:27 -0700 Subject: [PATCH 45/55] Update SampleVSOBot.md --- SampleVSOBot.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index a522ee5..e357ac2 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -1,6 +1,18 @@ #Using Authbot to authenticate in Visual Studio Online Here are more details about VSO authentication with Authbot +##Commands +The sample bot understands the following commands: +###logon or login +This will kick off the login process +###logout +If will log you out +###token +Will show your current VSO token. If the token expired, it will request a new one. +###echo +Will just reply echo so you know the bot is alive. +###projects +After you logged in, it will connect to Visual Studio Online (via REST Api) and query the List of projects at root level. ##Bot in action From 22a864c25467f8ec7ef2ce61d9acec39b3b53893 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 11:16:21 -0700 Subject: [PATCH 46/55] Update SampleVSOBot.md --- SampleVSOBot.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index e357ac2..2cd0505 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -3,16 +3,16 @@ Here are more details about VSO authentication with Authbot ##Commands The sample bot understands the following commands: -###logon or login -This will kick off the login process -###logout -If will log you out -###token -Will show your current VSO token. If the token expired, it will request a new one. -###echo -Will just reply echo so you know the bot is alive. -###projects -After you logged in, it will connect to Visual Studio Online (via REST Api) and query the List of projects at root level. + +Command | Description +--- | --- +*Still* | `renders` +logon or login | This will kick off the login process +logout | If will log you out +token | Will show your current VSO token. If the token expired, it will request a new one. +echo | Will just reply echo so you know the bot is alive. +projects | After you logged in, it will connect to Visual Studio Online (via REST Api) and query the List of projects at root level. + ##Bot in action From 79d662e43982c133535ac3759b3b7872dcf676db Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 11:23:56 -0700 Subject: [PATCH 47/55] Update SampleVSOBot.md --- SampleVSOBot.md | 1 - 1 file changed, 1 deletion(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 2cd0505..aae1739 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -6,7 +6,6 @@ The sample bot understands the following commands: Command | Description --- | --- -*Still* | `renders` logon or login | This will kick off the login process logout | If will log you out token | Will show your current VSO token. If the token expired, it will request a new one. From 84ee988b732ad1ecb84b5e929b671fcbaa0406af Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 11:26:23 -0700 Subject: [PATCH 48/55] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b4d57b..1fa6a68 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ To authenticate with VSO you´ll need: 1. You will register an application in https://app.vsaex.visualstudio.com/app/register. Unfortunatly currently you cannot specify localhost as the Authorization Callback URL. So you'll not be able to fully test the authentication flow with Bot Emulator. You will need to deploy to a site other than localhost. 2. During registration, you will select the scopes that your application needs. The application code itself will request for specific permissions in runtime and it needs to be a subset of the scopes defined in the registration process. The scopes are defined at logon time. 3. Look at SampleVSOBot project. Configure the area with your settings. -4. Check here for more details. +4. [Check here for more details.](SampleVSOBot.md) ### Tips with setup From cb9ccacbd7b9546b464974189d4ab25dc7c4eff8 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 12:35:14 -0700 Subject: [PATCH 49/55] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1fa6a68..408b7c4 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ To authenticate with VSO you´ll need: 1. You will register an application in https://app.vsaex.visualstudio.com/app/register. Unfortunatly currently you cannot specify localhost as the Authorization Callback URL. So you'll not be able to fully test the authentication flow with Bot Emulator. You will need to deploy to a site other than localhost. 2. During registration, you will select the scopes that your application needs. The application code itself will request for specific permissions in runtime and it needs to be a subset of the scopes defined in the registration process. The scopes are defined at logon time. -3. Look at SampleVSOBot project. Configure the area with your settings. +3. Look at SampleVSOBot project. Configure the web.config with your settings. 4. [Check here for more details.](SampleVSOBot.md) ### Tips with setup From f70d27a49b1a4253b3805f11028c467a4dd9d49a Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 12:36:43 -0700 Subject: [PATCH 50/55] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 408b7c4..1792cb2 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ To authenticate with VSO you´ll need: 1. You will register an application in https://app.vsaex.visualstudio.com/app/register. Unfortunatly currently you cannot specify localhost as the Authorization Callback URL. So you'll not be able to fully test the authentication flow with Bot Emulator. You will need to deploy to a site other than localhost. 2. During registration, you will select the scopes that your application needs. The application code itself will request for specific permissions in runtime and it needs to be a subset of the scopes defined in the registration process. The scopes are defined at logon time. -3. Look at SampleVSOBot project. Configure the web.config with your settings. +3. Look at SampleVSOBot project. Configure the in web.config with your settings. 4. [Check here for more details.](SampleVSOBot.md) ### Tips with setup From 4577e3bcdc05aa5bd40ffb1e38ee66ae54868d06 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 12:37:05 -0700 Subject: [PATCH 51/55] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1792cb2..12d6093 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ To authenticate with VSO you´ll need: 1. You will register an application in https://app.vsaex.visualstudio.com/app/register. Unfortunatly currently you cannot specify localhost as the Authorization Callback URL. So you'll not be able to fully test the authentication flow with Bot Emulator. You will need to deploy to a site other than localhost. 2. During registration, you will select the scopes that your application needs. The application code itself will request for specific permissions in runtime and it needs to be a subset of the scopes defined in the registration process. The scopes are defined at logon time. -3. Look at SampleVSOBot project. Configure the in web.config with your settings. +3. Look at SampleVSOBot project. Configure the appsettings area in web.config with your settings. 4. [Check here for more details.](SampleVSOBot.md) ### Tips with setup From 3b24c7c393e8887b0761149c866fea8003dd5e02 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 12:39:29 -0700 Subject: [PATCH 52/55] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 12d6093..51eaf1b 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ The goals are: * Enable scenarios where bots need to communicate with other services such as Office 365 or Azure by obtaining access tokens +* Support authentication to Visual Studio Team Services (www.visualstudio.com) + ## How does it work? From 62979c7569423929dace0262ac0a12450fb3d29d Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 12:45:32 -0700 Subject: [PATCH 53/55] Update SampleVSOBot.md --- SampleVSOBot.md | 1 + 1 file changed, 1 insertion(+) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index aae1739..66ee26d 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -41,3 +41,4 @@ projects | After you logged in, it will connect to Visual Studio Online (via RES ###https://app.vsaex.visualstudio.com/ ###https://app.vsaex.visualstudio.com/app/register ###[Authorize access to REST APIs with OAuth 2.0](https://www.visualstudio.com/docs/integrate/get-started/auth/oauth) +###[API Sandbox - Select Visual Studio Online on the left](https://apisandbox.msdn.microsoft.com/) From e7a0b09494540a1b2d76370225acbd793b429fd2 Mon Sep 17 00:00:00 2001 From: Tiago Andrade e Silva Date: Thu, 13 Oct 2016 12:46:24 -0700 Subject: [PATCH 54/55] Update SampleVSOBot.md --- SampleVSOBot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SampleVSOBot.md b/SampleVSOBot.md index 66ee26d..1181efd 100644 --- a/SampleVSOBot.md +++ b/SampleVSOBot.md @@ -41,4 +41,4 @@ projects | After you logged in, it will connect to Visual Studio Online (via RES ###https://app.vsaex.visualstudio.com/ ###https://app.vsaex.visualstudio.com/app/register ###[Authorize access to REST APIs with OAuth 2.0](https://www.visualstudio.com/docs/integrate/get-started/auth/oauth) -###[API Sandbox - Select Visual Studio Online on the left](https://apisandbox.msdn.microsoft.com/) +###[Sandbox for Visual Studio Rest API](https://apisandbox.msdn.microsoft.com/) From eb7e196aaeecf30184e63798bb55279f4d50630e Mon Sep 17 00:00:00 2001 From: tiagonmas Date: Thu, 13 Oct 2016 15:21:52 -0700 Subject: [PATCH 55/55] Reverting other 3 sample projects to same as origin to avoid conflicts --- OneDriveBot/OneDriveBot.csproj | 8 ++++---- OneDriveBot/Web.config | 12 ------------ SampleAADv2Bot/Web.config | 6 +++--- 3 files changed, 7 insertions(+), 19 deletions(-) diff --git a/OneDriveBot/OneDriveBot.csproj b/OneDriveBot/OneDriveBot.csproj index c511c7b..ba5630d 100644 --- a/OneDriveBot/OneDriveBot.csproj +++ b/OneDriveBot/OneDriveBot.csproj @@ -71,12 +71,12 @@ ..\packages\Microsoft.Identity.Client.1.0.304142221-alpha\lib\net45\Microsoft.Identity.Client.Platform.dll True - - ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.13.5\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll + + ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.12.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll True - - ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.13.5\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll + + ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.12.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll True diff --git a/OneDriveBot/Web.config b/OneDriveBot/Web.config index af9082e..0b13402 100644 --- a/OneDriveBot/Web.config +++ b/OneDriveBot/Web.config @@ -97,18 +97,6 @@ - - - - - - - - - - - - diff --git a/SampleAADv2Bot/Web.config b/SampleAADv2Bot/Web.config index d27465f..87a94db 100644 --- a/SampleAADv2Bot/Web.config +++ b/SampleAADv2Bot/Web.config @@ -6,9 +6,9 @@ - - - + + +