diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2019-02-20 22:55:15 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2019-02-20 22:55:15 +0200 |
| commit | 9447a8a09f87d6ea2cb62860021c595386668eec (patch) | |
| tree | a02db15a1247587f14fedb6ccae76f79bd63afb3 /Software/Visual_Studio/Web/Tango.MachineService | |
| parent | 17446569ca8d8dd00331da5926b938593c4b117f (diff) | |
| download | Tango-9447a8a09f87d6ea2cb62860021c595386668eec.tar.gz Tango-9447a8a09f87d6ea2cb62860021c595386668eec.zip | |
A lot of work !!!
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService')
10 files changed, 98 insertions, 119 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/App_Start/WebApiConfig.cs b/Software/Visual_Studio/Web/Tango.MachineService/App_Start/WebApiConfig.cs index 0a63e9acb..73265328c 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/App_Start/WebApiConfig.cs +++ b/Software/Visual_Studio/Web/Tango.MachineService/App_Start/WebApiConfig.cs @@ -22,10 +22,10 @@ namespace Tango.MachineService defaults: new { id = RouteParameter.Optional }); config.Formatters.Insert(0, new ProtoBufFormatter()); - config.Formatters.Insert(1, new JsonNetFormatter(new JsonSerializerSettings() - { - PreserveReferencesHandling = PreserveReferencesHandling.All, - })); + //config.Formatters.Insert(1, new JsonNetFormatter(new JsonSerializerSettings() + //{ + // PreserveReferencesHandling = PreserveReferencesHandling.All, + //})); } } } diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs index 054c8d781..467b6ae28 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs +++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs @@ -24,12 +24,15 @@ using Tango.MachineService.Filters; namespace Tango.MachineService.Controllers { - public class MachineStudioController : JsonController + public class MachineStudioController : TangoController<MachineStudioController.TokenObject> { private static List<MachineStudioPendingUpload> _pendingUploads; private ActiveDirectoryManager _ad_manager; - public static TokensManager<String> TokensManager { get; set; } + public class TokenObject + { + public String UserGuid { get; set; } + } #region Constructors @@ -38,8 +41,6 @@ namespace Tango.MachineService.Controllers /// </summary> static MachineStudioController() { - TokensManager = new TokensManager<string>(); - TokensManager.ExpirationTime = TimeSpan.FromDays(10); _pendingUploads = new List<MachineStudioPendingUpload>(); } @@ -61,11 +62,13 @@ namespace Tango.MachineService.Controllers /// <param name="request">The request.</param> /// <returns></returns> [HttpPost] - [MachineStudioLoginFilter] + [JwtTokenFilter] public CheckForUpdatesResponse CheckForUpdates(CheckForUpdatesRequest request) { LogManager.Log("Request received..."); + var userID = RequestToken.Object.UserGuid; + CheckForUpdatesResponse response = new CheckForUpdatesResponse(); using (ObservablesContext db = ObservablesContextHelper.CreateContext()) @@ -103,7 +106,7 @@ namespace Tango.MachineService.Controllers /// <param name="request">The request.</param> /// <returns></returns> [HttpPost] - [MachineStudioLoginFilter] + [JwtTokenFilter] public DownloadLatestVersionResponse DownloadLatestVersion(DownloadLatestVersionRequest request) { LogManager.Log("Request received..."); @@ -138,14 +141,14 @@ namespace Tango.MachineService.Controllers /// <exception cref="System.ArgumentException">New version must be greater than latest version.</exception> /// <exception cref="AuthenticationException">Invalid user credentials.</exception> [HttpPost] - [MachineStudioLoginFilter] + [JwtTokenFilter] public UploadVersionResponse UploadVersion(UploadVersionRequest request) { UploadVersionResponse response = new UploadVersionResponse(); using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { - String userID = TokensManager.GetTokenObject(request.AccessToken); + String userID = RequestToken.Object.UserGuid; var user = new UserBuilder(db).Set(userID).WithRolesAndPermissions().Build(); @@ -195,7 +198,7 @@ namespace Tango.MachineService.Controllers /// <returns></returns> /// <exception cref="System.ArgumentException">Invalid Token.</exception> [HttpPost] - [MachineStudioLoginFilter] + [JwtTokenFilter] public UploadCompletedResponse NotifyUploadCompleted(UploadCompletedRequest request) { MachineStudioPendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token); @@ -347,7 +350,10 @@ namespace Tango.MachineService.Controllers Password = request.Password, }, - WebToken = TokensManager.GetOrCreate(user.Guid), + AccessToken = WebToken<TokenObject>.CreateNew(MachineServiceConfig.JWT_TOKEN_SECRET, new TokenObject() + { + UserGuid = user.Guid, + }, DateTime.UtcNow.AddDays(1)).AccessToken, VersionChangeRequired = versionChangeRequired, RequiredVersion = requiredVersion, }; diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs index 70d64be51..912d2e5e9 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs +++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs @@ -26,30 +26,22 @@ using Tango.MachineService.Filters; namespace Tango.MachineService.Controllers { - public class PPCController : JsonController + public class PPCController : TangoController<PPCController.TokenObject> { private static List<PPCPendingUpload> _pendingUploads; private ActiveDirectoryManager _ad_manager; - public class TokenObject : IEquatable<TokenObject> + public class TokenObject { public LoginMode Mode { get; set; } public String UserGuid { get; set; } public String MachineGuid { get; set; } - - public bool Equals(TokenObject other) - { - return UserGuid == other.UserGuid || MachineGuid == MachineGuid; - } } - public static TokensManager<TokenObject> TokensManager { get; set; } - #region Constructors static PPCController() { - TokensManager = new TokensManager<TokenObject>(); _pendingUploads = new List<PPCPendingUpload>(); } @@ -62,8 +54,8 @@ namespace Tango.MachineService.Controllers #region Setup & Update - [PPCLoginFilter] [HttpPost] + [JwtTokenFilter] public MachineSetupResponse MachineSetup(MachineSetupRequest request) { MachineSetupResponse response = new MachineSetupResponse(); @@ -73,7 +65,7 @@ namespace Tango.MachineService.Controllers using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { db.Configuration.LazyLoadingEnabled = false; - String machine_guid = TokensManager.GetTokenObject(request.AccessToken).MachineGuid; + String machine_guid = RequestToken.Object.MachineGuid; var machine = db.Machines.SingleOrDefault(x => x.Guid == machine_guid); @@ -136,8 +128,8 @@ namespace Tango.MachineService.Controllers return response; } - [PPCLoginFilter] [HttpPost] + [JwtTokenFilter] public DownloadUpdateResponse MachineUpdate(DownloadUpdateRequest request) { DownloadUpdateResponse response = new DownloadUpdateResponse(); @@ -145,7 +137,7 @@ namespace Tango.MachineService.Controllers using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { db.Configuration.LazyLoadingEnabled = false; - String machine_guid = TokensManager.GetTokenObject(request.AccessToken).MachineGuid; + String machine_guid = RequestToken.Object.MachineGuid; var machine = db.Machines.SingleOrDefault(x => x.Guid == machine_guid); @@ -195,15 +187,15 @@ namespace Tango.MachineService.Controllers return response; } - [PPCLoginFilter] [HttpPost] + [JwtTokenFilter] public CheckForUpdateResponse CheckForUpdate(CheckForUpdateRequest request) { CheckForUpdateResponse response = new CheckForUpdateResponse(); using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { - String machine_guid = TokensManager.GetTokenObject(request.AccessToken).MachineGuid; + String machine_guid = RequestToken.Object.MachineGuid; var machine = db.Machines.SingleOrDefault(x => x.Guid == machine_guid); @@ -227,8 +219,8 @@ namespace Tango.MachineService.Controllers return response; } - [PPCLoginFilter] [HttpPost] + [JwtTokenFilter] public UpdateDBResponse UpdateDB(UpdateDBRequest request) { UpdateDBResponse response = new UpdateDBResponse(); @@ -236,7 +228,7 @@ namespace Tango.MachineService.Controllers using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { - String machine_guid = TokensManager.GetTokenObject(request.AccessToken).MachineGuid; + String machine_guid = RequestToken.Object.MachineGuid; var machine = db.Machines.SingleOrDefault(x => x.Guid == machine_guid); @@ -301,8 +293,8 @@ namespace Tango.MachineService.Controllers return response; } - [PPCLoginFilter] [HttpPost] + [JwtTokenFilter] public UploadVersionResponse UploadVersion(UploadVersionRequest request) { UploadVersionResponse response = new UploadVersionResponse(); @@ -315,7 +307,7 @@ namespace Tango.MachineService.Controllers db.UsersRoles.ToList(); db.RolesPermissions.ToList(); - var user_guid = TokensManager.GetTokenObject(request.AccessToken).UserGuid; + var user_guid = RequestToken.Object.UserGuid; var user = new UserBuilder(db).Set(user_guid).WithRolesAndPermissions().Build(); @@ -369,8 +361,8 @@ namespace Tango.MachineService.Controllers return response; } - [PPCLoginFilter] [HttpPost] + [JwtTokenFilter] public UploadCompletedResponse NotifyUploadCompleted(UploadCompletedRequest request) { PPCPendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token); @@ -439,11 +431,11 @@ namespace Tango.MachineService.Controllers throw new AuthenticationException("Domain user found but the database entry validation failed."); } - response.WebToken = TokensManager.GetOrCreate(new TokenObject() + response.AccessToken = WebToken<TokenObject>.CreateNew(MachineServiceConfig.JWT_TOKEN_SECRET, new TokenObject() { Mode = LoginMode.User, UserGuid = user.Guid, - }); + }).AccessToken; } else if (request.Mode == LoginMode.Machine) { @@ -454,11 +446,11 @@ namespace Tango.MachineService.Controllers throw new AuthenticationException("Invalid serial number."); } - response.WebToken = TokensManager.GetOrCreate(new TokenObject() + response.AccessToken = WebToken<TokenObject>.CreateNew(MachineServiceConfig.JWT_TOKEN_SECRET, new TokenObject() { Mode = LoginMode.Machine, MachineGuid = machine.Guid, - }); + }).AccessToken; } } diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Filters/JwtTokenFilter.cs b/Software/Visual_Studio/Web/Tango.MachineService/Filters/JwtTokenFilter.cs new file mode 100644 index 000000000..4cf22cc43 --- /dev/null +++ b/Software/Visual_Studio/Web/Tango.MachineService/Filters/JwtTokenFilter.cs @@ -0,0 +1,46 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Security.Authentication; +using System.Web; +using System.Web.Http; +using System.Web.Http.Controllers; +using System.Web.Http.Filters; +using Tango.Transport.Web; +using Tango.Web.Authentication; + +namespace Tango.MachineService.Filters +{ + public class JwtTokenFilter : ActionFilterAttribute + { + public override void OnActionExecuting(HttpActionContext actionContext) + { + var authorizationHeader = actionContext.Request.Headers.Authorization; + + if (authorizationHeader != null && authorizationHeader.Parameter != null) + { + try + { + WebToken.Validate(MachineServiceConfig.JWT_TOKEN_SECRET, authorizationHeader.Parameter); + } + catch (JWT.TokenExpiredException) + { + throw new TokenExpiredException("Token expired."); + } + catch (JWT.SignatureVerificationException) + { + throw new InvalidTokenException("Invalid token."); + } + } + else + { + throw new AuthenticationException("No token specified."); + } + + base.OnActionExecuting(actionContext); + } + } +}
\ No newline at end of file diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Filters/MachineStudioLoginFilter.cs b/Software/Visual_Studio/Web/Tango.MachineService/Filters/MachineStudioLoginFilter.cs deleted file mode 100644 index dfa78f0a0..000000000 --- a/Software/Visual_Studio/Web/Tango.MachineService/Filters/MachineStudioLoginFilter.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Security.Authentication; -using System.Web; -using System.Web.Http; -using System.Web.Http.Controllers; -using System.Web.Http.Filters; -using Tango.Transport.Web; - -namespace Tango.MachineService.Filters -{ - public class MachineStudioLoginFilter : ActionFilterAttribute - { - public override void OnActionExecuting(HttpActionContext actionContext) - { - var json = actionContext.Request.Content.ReadAsStringAsync().Result; - WebRequestSecureMessage msg = JsonConvert.DeserializeObject<WebRequestSecureMessage>(json); - - try - { - Controllers.MachineStudioController.TokensManager.Validate(msg.AccessToken); - } - catch (Exception ex) - { - throw new HttpResponseException(actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, ex)); - } - - base.OnActionExecuting(actionContext); - } - } -}
\ No newline at end of file diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Filters/PPCLoginFilter.cs b/Software/Visual_Studio/Web/Tango.MachineService/Filters/PPCLoginFilter.cs deleted file mode 100644 index 322023b7d..000000000 --- a/Software/Visual_Studio/Web/Tango.MachineService/Filters/PPCLoginFilter.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Security.Authentication; -using System.Web; -using System.Web.Http; -using System.Web.Http.Controllers; -using System.Web.Http.Filters; -using Tango.Transport.Web; - -namespace Tango.MachineService.Filters -{ - public class PPCLoginFilter : ActionFilterAttribute - { - public override void OnActionExecuting(HttpActionContext actionContext) - { - var json = actionContext.Request.Content.ReadAsStringAsync().Result; - WebRequestSecureMessage msg = JsonConvert.DeserializeObject<WebRequestSecureMessage>(json); - - try - { - Controllers.PPCController.TokensManager.Validate(msg.AccessToken); - } - catch (Exception ex) - { - throw new HttpResponseException(actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, ex)); - } - - base.OnActionExecuting(actionContext); - } - } -}
\ No newline at end of file diff --git a/Software/Visual_Studio/Web/Tango.MachineService/MachineServiceConfig.cs b/Software/Visual_Studio/Web/Tango.MachineService/MachineServiceConfig.cs index 289fb08e2..a6aa71944 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/MachineServiceConfig.cs +++ b/Software/Visual_Studio/Web/Tango.MachineService/MachineServiceConfig.cs @@ -12,5 +12,6 @@ namespace Tango.MachineService public static String TANGO_VERSIONS_CONTAINER => ConfigurationManager.AppSettings[nameof(TANGO_VERSIONS_CONTAINER)].ToString(); public static String MACHINE_STUDIO_VERSIONS_CONTAINER => ConfigurationManager.AppSettings[nameof(MACHINE_STUDIO_VERSIONS_CONTAINER)].ToString(); public static bool ENFORCE_MACHINE_STUDIO_VERSION => bool.Parse(ConfigurationManager.AppSettings[nameof(ENFORCE_MACHINE_STUDIO_VERSION)].ToString()); + public static String JWT_TOKEN_SECRET => ConfigurationManager.AppSettings[nameof(JWT_TOKEN_SECRET)].ToString(); } }
\ No newline at end of file diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj b/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj index 038849c72..6dbbe49ab 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj +++ b/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj @@ -56,6 +56,9 @@ <Reference Include="Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL"> <HintPath>..\..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll</HintPath> </Reference> + <Reference Include="JWT, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>..\..\packages\JWT.5.0.0\lib\net46\JWT.dll</HintPath> + </Reference> <Reference Include="Microsoft.Azure.Common, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> <Reference Include="Microsoft.Azure.Common.NetFramework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> <Reference Include="Microsoft.Azure.Management.Sql, Version=0.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> @@ -161,8 +164,8 @@ <HintPath>..\..\packages\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.WmiEnum.dll</HintPath> </Reference> <Reference Include="Microsoft.WindowsAzure.Storage, Version=4.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> - <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> - <HintPath>..\..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll</HintPath> + <Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> + <HintPath>..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> </Reference> <Reference Include="System" /> <Reference Include="System.Data" /> @@ -275,8 +278,7 @@ </Compile> <Compile Include="App_Start\BundleConfig.cs" /> <Compile Include="App_Start\FilterConfig.cs" /> - <Compile Include="Filters\MachineStudioLoginFilter.cs" /> - <Compile Include="Filters\PPCLoginFilter.cs" /> + <Compile Include="Filters\JwtTokenFilter.cs" /> <Compile Include="MachineServiceConfig.cs" /> <Compile Include="Controllers\MachineStudioController.cs" /> <Compile Include="Models\MachineStudioPendingUpload.cs" /> @@ -379,7 +381,7 @@ <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile> </WebProjectProperties> </FlavorProperties> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Web.config b/Software/Visual_Studio/Web/Tango.MachineService/Web.config index 72c56b38f..fb10e615e 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Web.config +++ b/Software/Visual_Studio/Web/Tango.MachineService/Web.config @@ -16,16 +16,17 @@ <add key="DB_ADDRESS" value="twine.database.windows.net" /> <add key="DB_USER_NAME" value="Roy" /> <add key="DB_PASSWORD" value="Aa123456" /> - <add key="DB_CATALOG" value="Tango" /> + <add key="DB_CATALOG" value="Tango_DEV" /> <add key="STORAGE_ACCOUNT" value="DefaultEndpointsProtocol=https;AccountName=tangostorage;AccountKey=S4z/D+Yg6mwMis+bs/VpcDLA9yE1iZaYq23shQlRIi2KmM9E7JY8zdZjeAPOPdG3gONHoNDEpsgH6D4cqQ/bsA==;EndpointSuffix=core.windows.net" /> <add key="TENANT_ID" value="2ebd63a5-bc2f-41dc-9066-4409ed5e5dd4" /> <add key="CLIENT_ID" value="ec612854-7abc-457b-808a-5d0c5ba80c57" /> <add key="APP_SECRET" value="54)019A7wv+#86l*PQcQWYKu%fd4Dv!@G=VhCiDI5rD+H4BTH" /> - <add key="TANGO_VERSIONS_CONTAINER" value="tango-versions" /> - <add key="MACHINE_STUDIO_VERSIONS_CONTAINER" value="machine-studio-versions" /> + <add key="TANGO_VERSIONS_CONTAINER" value="tango-versions-dev" /> + <add key="MACHINE_STUDIO_VERSIONS_CONTAINER" value="machine-studio-versions-dev" /> <add key="DEPLOYMENT_SLOT" value="DEV" /> <add key="ENVIRONMENT_GROUP" value="Tango DEV" /> <add key="ENFORCE_MACHINE_STUDIO_VERSION" value="true" /> + <add key="JWT_TOKEN_SECRET" value="GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk" /> </appSettings> <!-- For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367. @@ -59,7 +60,7 @@ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" /> - <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" /> + <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" /> diff --git a/Software/Visual_Studio/Web/Tango.MachineService/packages.config b/Software/Visual_Studio/Web/Tango.MachineService/packages.config index e9f37dbe5..7bc1a3288 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/packages.config +++ b/Software/Visual_Studio/Web/Tango.MachineService/packages.config @@ -3,6 +3,7 @@ <package id="Antlr" version="3.4.1.9004" targetFramework="net45" /> <package id="EntityFramework" version="6.2.0" targetFramework="net461" /> <package id="Google.Protobuf" version="3.4.1" targetFramework="net46" /> + <package id="JWT" version="5.0.0" targetFramework="net461" /> <package id="Microsoft.ApplicationInsights" version="2.2.0" targetFramework="net45" requireReinstallation="true" /> <package id="Microsoft.ApplicationInsights.Agent.Intercept" version="2.0.6" targetFramework="net45" /> <package id="Microsoft.ApplicationInsights.DependencyCollector" version="2.2.0" targetFramework="net45" /> @@ -25,7 +26,7 @@ <package id="Microsoft.SqlServer.SqlManagementObjects" version="140.17283.0" targetFramework="net461" /> <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" /> <package id="Modernizr" version="2.6.2" targetFramework="net45" /> - <package id="Newtonsoft.Json" version="8.0.3" targetFramework="net46" /> + <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net461" /> <package id="Respond" version="1.2.0" targetFramework="net45" /> <package id="System.Data.SQLite" version="1.0.108.0" targetFramework="net46" /> <package id="System.Data.SQLite.Core" version="1.0.108.0" targetFramework="net46" /> |
