Performed minor code cleanup and addressed authorization issue.

This commit is contained in:
Isaiah Williams 2018-07-06 10:32:33 -05:00 коммит произвёл GitHub
Родитель 13ddd50d28 0c1cfdb8fa
Коммит ce5ab9f60b
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
61 изменённых файлов: 712 добавлений и 551 удалений

29
.github/ISSUE_TEMPLATE/BUG_REPORT.md поставляемый Normal file
Просмотреть файл

@ -0,0 +1,29 @@
---
name: Bug report
about: Create a report to help us improve
---
# Steps to reproduce
> What steps can reproduce the defect?
> Please share the setup, commandline for vstest.console, sample project, target
> framework etc.
## Expected behavior
> Share the expected output
## Actual behavior
> What is the behavior observed?
## Diagnostic logs
> Please share test platform diagnostics logs.
> The logs may contain test assembly paths, kindly review and mask those before sharing.
## Environment
> Please share additional details about your environment.
> Version

19
.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md поставляемый Normal file
Просмотреть файл

@ -0,0 +1,19 @@
---
name: Feature request
about: Suggest an idea for this project
---
# Feature Request
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I am always frustrated when [...]
**Describe the solution you would like**
A clear and concise description of what you want to happen.
**Describe alternatives you have considered**
A clear and concise description of any alternative solutions or features you have considered.
**Additional context**
Add any other context or screenshots about the feature request here.

7
.github/PULL_REQUEST_TEMPLATE.md поставляемый Normal file
Просмотреть файл

@ -0,0 +1,7 @@
# Description
Please add a meaningful description for this change. Ensure the PR has required unit tests.
## Related issue
Kindly link any related issues (e.g. Fixes #xyz).

51
.gitignore поставляемый
Просмотреть файл

@ -1,5 +1,7 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.suo
@ -40,9 +42,11 @@ TestResult.xml
[Rr]eleasePS/
dlldata.c
# DNX
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
*_i.c
*_p.c
@ -109,6 +113,10 @@ _TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
@ -158,7 +166,7 @@ PublishScripts/
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
@ -188,9 +196,9 @@ ClientBin/
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
@ -211,6 +219,7 @@ UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
@ -225,6 +234,10 @@ FakesAssemblies/
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Typescript v1 declaration files
typings/
# Visual Studio 6 build log
*.plg
@ -232,6 +245,9 @@ FakesAssemblies/
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
@ -249,4 +265,31 @@ paket-files/
# JetBrains Rider
.idea/
*.sln.iml
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json

Просмотреть файл

@ -1,13 +0,0 @@
## Partner-Center-Explorer Changelog
<a name="0.0.1"></a>
# 0.0.1 (3/24/2018)
*Features*
* No new features
*Bug Fixes*
* [Authentication loop](https://github.com/Microsoft/Partner-Center-Explorer/issues/3) whenever an authentication failure occurred
*Breaking Changes*
* None

Просмотреть файл

@ -1,5 +0,0 @@
### Expected behavior
### Actual behavior
### Steps to reproduce the problem

Просмотреть файл

@ -9,10 +9,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
ProjectSection(SolutionItems) = preProject
azuredeploy.json = azuredeploy.json
azuredeploy.param.json = azuredeploy.param.json
CHANGELOG.md = CHANGELOG.md
CODE_OF_CONDUCT.md = CODE_OF_CONDUCT.md
CONTRIBUTING.md = CONTRIBUTING.md
ISSUE_TEMPLATE.md = ISSUE_TEMPLATE.md
LICENSE = LICENSE
README.md = README.md
EndProjectSection

Просмотреть файл

@ -64,17 +64,23 @@
"description": "The size of the new Azure Redis Cache instance."
}
},
"partnerCenterAccountId": {
"type": "string",
"metadata": {
"description": "Account identifier value from the Azure AD application configured to access the Partner Center API."
}
},
"partnerCenterApplicationId": {
"type": "string",
"minLength": 1
"metadata": {
"description": "Application identifier value from the Azure AD application configured to access the Partner Center API."
}
},
"partnerCenterApplicationSecret": {
"type": "string",
"minLength": 1
},
"partnerCenterApplicationTenantId": {
"type": "string",
"minLength": 1
"type": "securestring",
"metadata": {
"description": "Secret key for the Azure AD application configured to access the Partner Center API."
}
},
"repoUrl": {
"type": "string",
@ -220,8 +226,8 @@
"ApplicationTenantId": "[parameters('applicationTenantId')]",
"KeyVaultEndpoint": "[concat('https://', variables('keyVaultName'), '.vault.azure.net')]",
"InstrumentationKey": "[reference(concat('Microsoft.Insights/components/', parameters('webSiteName'))).InstrumentationKey]",
"PartnerCenterApplicationId": "[parameters('partnerCenterApplicationId')]",
"PartnerCenterApplicationTenantId": "[parameters('partnerCenterApplicationTenantId')]"
"PartnerCenterAccountId": "[parameters('partnerCenterAccountId')]",
"PartnerCenterApplicationId": "[parameters('partnerCenterApplicationId')]"
}
}
]

Просмотреть файл

@ -7,11 +7,9 @@
},
"applicationSecret": {
"value": ""
},
"applicationTenantId": {
"value": ""
},
"branch": {
"value": "master"
@ -25,15 +23,15 @@
"cacheSKUCapacity": {
"value": 0
},
"partnerCenterAccountId": {
"value": ""
},
"partnerCenterApplicationId": {
"value": ""
},
"partnerCenterApplicationSecret": {
"value": ""
},
"partnerCenterApplicationTenantId": {
"value": ""
},
"repoUrl": {
"value": "https://github.com/Microsoft/Partner-Center-Explorer"
},

Просмотреть файл

@ -11,7 +11,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer
/// <summary>
/// Configures the bundles used by the application.
/// </summary>
public class BundleConfig
public static class BundleConfig
{
/// <summary>
/// Registers the bundles.

Просмотреть файл

@ -13,7 +13,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer
/// <summary>
/// Configures the application filters.
/// </summary>
public class FilterConfig
public static class FilterConfig
{
/// <summary>
/// Registers the global filters.
@ -21,7 +21,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer
/// <param name="filters">The global filter collection.</param>
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AuthenticationFilter());
filters.Add(new AuthenticationFilterAttribute());
filters.Add(new TelemetryHandleErrorAttribute());
}
}

Просмотреть файл

@ -12,7 +12,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer
/// <summary>
/// Configures routing for the application.
/// </summary>
public class RouteConfig
public static class RouteConfig
{
/// <summary>
/// Registers the routes for the application.

Просмотреть файл

@ -10,8 +10,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer
using System.Collections.Generic;
using System.Threading.Tasks;
using global::Owin;
using Logic;
using IdentityModel.Tokens;
using Logic;
using Models;
using Owin.Security;
using Owin.Security.Cookies;

Просмотреть файл

@ -59,6 +59,33 @@
-->
</Add>
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryModule, Microsoft.AI.PerfCounterCollector"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.AppServicesHeartbeatTelemetryModule, Microsoft.AI.WindowsServer"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureInstanceMetadataTelemetryModule, Microsoft.AI.WindowsServer">
<!--
Remove individual fields collected here by adding them to the ApplicationInsighs.HeartbeatProvider
with the following syntax:
<Add Type="Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule, Microsoft.ApplicationInsights">
<ExcludedHeartbeatProperties>
<Add>osType</Add>
<Add>location</Add>
<Add>name</Add>
<Add>offer</Add>
<Add>platformFaultDomain</Add>
<Add>platformUpdateDomain</Add>
<Add>publisher</Add>
<Add>sku</Add>
<Add>version</Add>
<Add>vmId</Add>
<Add>vmSize</Add>
<Add>subscriptionId</Add>
<Add>resourceGroupName</Add>
</ExcludedHeartbeatProperties>
</Add>
NOTE: exclusions will be lost upon upgrade.
-->
</Add>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule, Microsoft.AI.WindowsServer"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule, Microsoft.AI.WindowsServer"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule, Microsoft.AI.WindowsServer">
@ -85,8 +112,14 @@
<Add Type="Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule, Microsoft.AI.Web"/>
<Add Type="Microsoft.ApplicationInsights.Web.AspNetDiagnosticTelemetryModule, Microsoft.AI.Web"/>
</TelemetryModules>
<ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights"/>
<TelemetryProcessors>
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryProcessor, Microsoft.AI.PerfCounterCollector"/>
<Add Type="Microsoft.ApplicationInsights.SnapshotCollector.SnapshotCollectorTelemetryProcessor, Microsoft.ApplicationInsights.SnapshotCollector">
<!-- Snapshot Debugging is usually disabled when debugging in Visual Studio, but you can enable it by setting this to true. -->
<IsEnabledInDeveloperMode>false</IsEnabledInDeveloperMode>
<!-- Other properties are documented at https://aka.ms/pnv0qt -->
</Add>
<Add Type="Microsoft.ApplicationInsights.Extensibility.AutocollectedMetricsExtractor, Microsoft.ApplicationInsights"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
<MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
@ -96,25 +129,6 @@
<MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
<IncludedTypes>Event</IncludedTypes>
</Add>
<Add Type="Microsoft.ApplicationInsights.SnapshotCollector.SnapshotCollectorTelemetryProcessor, Microsoft.ApplicationInsights.SnapshotCollector">
<!-- The default is true, but you can disable Snapshot Debugging by setting it to false -->
<IsEnabled>true</IsEnabled>
<!-- Snapshot Debugging is usually disabled in developer mode, but you can enable it by setting this to true. -->
<!-- DeveloperMode is a property on the active TelemetryChannel. -->
<IsEnabledInDeveloperMode>false</IsEnabledInDeveloperMode>
<!-- How many times we need to see an exception before we ask for snapshots. -->
<ThresholdForSnapshotting>1</ThresholdForSnapshotting>
<!-- The maximum number of snapshots we collect for a single problem. -->
<MaximumSnapshotsRequired>3</MaximumSnapshotsRequired>
<!-- The maximum number of problems that we can be tracking at any time. -->
<MaximumCollectionPlanSize>50</MaximumCollectionPlanSize>
<!-- How often to reset problem counters. -->
<ProblemCounterResetInterval>24:00:00</ProblemCounterResetInterval>
<!-- The maximum number of snapshots allowed per day. -->
<SnapshotsPerDayLimit>30</SnapshotsPerDayLimit>
<!--Whether or not to collect snapshot in low IO priority thread.-->
<SnapshotInLowPriorityThread>true</SnapshotInLowPriorityThread>
</Add>
</TelemetryProcessors>
<TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel"/>
<!--

Просмотреть файл

@ -40,7 +40,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
HttpContext.GetOwinContext().Authentication.SignOut(
new AuthenticationProperties { RedirectUri = callbackUrl },
OpenIdConnectAuthenticationDefaults.AuthenticationType,
OpenIdConnectAuthenticationDefaults.AuthenticationType,
CookieAuthenticationDefaults.AuthenticationType);
}

Просмотреть файл

@ -17,7 +17,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// Controller for Audit views.
/// </summary>
/// <seealso cref="System.Web.Mvc.Controller" />
[AuthorizationFilter(Roles = UserRole.Partner)]
[AuthorizationFilter(Roles = UserRoles.Partner)]
public class AuditController : BaseController
{
/// <summary>

Просмотреть файл

@ -8,8 +8,6 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
{
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Mvc;
using Logic;
@ -22,7 +20,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <summary>
/// Controller for all Customers views.
/// </summary>
[AuthorizationFilter(Roles = UserRole.Partner)]
[AuthorizationFilter(Roles = UserRoles.Partner)]
public class CustomersController : BaseController
{
/// <summary>
@ -33,27 +31,6 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
{
}
/// <summary>
/// Deletes the specified customer.
/// </summary>
/// <param name="customerId">The customer identifier.</param>
/// <returns>Returns the NoContent HTTP status code.</returns>
/// <exception cref="ArgumentException">
/// <paramref name="customerId"/> is empty or null.
/// </exception>
[HttpDelete]
public async Task<HttpResponseMessage> Delete(string customerId)
{
customerId.AssertNotEmpty(nameof(customerId));
if (Provider.Configuration.IsIntegrationSandbox)
{
await Provider.PartnerOperations.DeleteCustomerAsync(customerId).ConfigureAwait(false);
}
return new HttpResponseMessage(HttpStatusCode.NoContent);
}
/// <summary>
/// Serves the HTML template for the create view.
/// </summary>
@ -130,11 +107,9 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <returns>The HTML template for the list page.</returns>
public async Task<ActionResult> List()
{
CustomersModel customersModel = new CustomersModel()
{
Customers = await GetCustomerModelsAsync().ConfigureAwait(false),
IsSandboxEnvironment = Provider.Configuration.IsIntegrationSandbox
};
CustomersModel customersModel = new CustomersModel();
customersModel.Customers.AddRange(await GetCustomerModelsAsync().ConfigureAwait(false));
return PartialView(customersModel);
}

Просмотреть файл

@ -18,7 +18,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <summary>
/// Controller for all Domain views.
/// </summary>
[AuthorizationFilter(Roles = UserRole.Partner)]
[AuthorizationFilter(Roles = UserRoles.Partner)]
public class DomainsController : BaseController
{
/// <summary>
@ -36,15 +36,19 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <returns>A collection of service configuration records for the specified domain in JSON.</returns>
public async Task<PartialViewResult> ConfigurationRecords(string customerId, string domain)
{
ConfigurationRecordsModel configurationRecords;
GraphClient client;
List<DomainDnsRecord> records;
try
{
client = new GraphClient(Provider, customerId);
configurationRecords = new ConfigurationRecordsModel();
records = await client.GetDomainConfigurationRecordsAsync(domain).ConfigureAwait(false);
return PartialView(new ConfigurationRecordsModel { ServiceConfigurationRecords = records });
configurationRecords.ServiceConfigurationRecords.AddRange(records);
return PartialView(configurationRecords);
}
finally
{

Просмотреть файл

@ -22,7 +22,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <summary>
/// Handles request for the Health views.
/// </summary>
[AuthorizationFilter(Roles = UserRole.Partner)]
[AuthorizationFilter(Roles = UserRoles.Partner)]
public class HealthController : BaseController
{
/// <summary>
@ -47,6 +47,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
public async Task<ActionResult> Index(string customerId, string subscriptionId)
{
Customer customer;
List<IHealthEvent> events;
SubscriptionHealthModel healthModel;
Subscription subscription;
@ -69,13 +70,15 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
if (subscription.BillingType == BillingType.Usage)
{
healthModel.HealthEvents = await GetAzureSubscriptionHealthAsync(customerId, subscriptionId);
events = await GetAzureSubscriptionHealthAsync(customerId, subscriptionId).ConfigureAwait(false);
}
else
{
healthModel.HealthEvents = await GetOfficeSubscriptionHealthAsync(customerId).ConfigureAwait(false);
events = await GetOfficeSubscriptionHealthAsync(customerId).ConfigureAwait(false);
}
healthModel.HealthEvents.AddRange(events);
return View(healthModel.ViewModel, healthModel);
}
finally

Просмотреть файл

@ -6,7 +6,6 @@
namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
{
using System;
using System.Web.Mvc;
using Providers;
using Security;
@ -27,7 +26,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// Handles the request for the index view.
/// </summary>
/// <returns>The HTML template for the index page.</returns>
[AuthorizationFilter(Roles = UserRole.Partner)]
[AuthorizationFilter(Roles = UserRoles.Partner)]
public ActionResult Index()
{
return View();

Просмотреть файл

@ -23,7 +23,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <summary>
/// Control invoice related operations.
/// </summary>
[AuthorizationFilter(Roles = UserRole.Partner)]
[AuthorizationFilter(Roles = UserRoles.Partner)]
public class InvoicesController : BaseController
{
/// <summary>
@ -50,10 +50,10 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
customerName.AssertNotEmpty(nameof(customerName));
invoiceId.AssertNotEmpty(nameof(invoiceId));
InvoiceDetailsModel invoiceDetailsModel = new InvoiceDetailsModel()
{
InvoiceLineItems = await GetInvoiceLineItemsAsync(invoiceId, customerName, "Azure").ConfigureAwait(false)
};
InvoiceDetailsModel invoiceDetailsModel = new InvoiceDetailsModel();
invoiceDetailsModel.InvoiceLineItems.AddRange(
await GetInvoiceLineItemsAsync(invoiceId, customerName, "Azure").ConfigureAwait(false));
return PartialView(invoiceDetailsModel);
}
@ -64,10 +64,9 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <returns>A view containing the InvoicesModel model.</returns>
public async Task<ActionResult> Index()
{
InvoicesModel invoicesModel = new InvoicesModel()
{
Invoices = await Provider.PartnerOperations.GetInvoicesAsync().ConfigureAwait(false)
};
InvoicesModel invoicesModel = new InvoicesModel();
invoicesModel.Invoices.AddRange(await Provider.PartnerOperations.GetInvoicesAsync().ConfigureAwait(false));
return View(invoicesModel);
}
@ -196,10 +195,11 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
customerName.AssertNotEmpty(nameof(customerName));
invoiceId.AssertNotEmpty(nameof(invoiceId));
InvoiceDetailsModel invoiceDetailsModel = new InvoiceDetailsModel()
{
InvoiceLineItems = await GetInvoiceLineItemsAsync(invoiceId, customerName, "Office").ConfigureAwait(false)
};
InvoiceDetailsModel invoiceDetailsModel = new InvoiceDetailsModel();
invoiceDetailsModel.InvoiceLineItems.AddRange(
await GetInvoiceLineItemsAsync(invoiceId, customerName, "Office").ConfigureAwait(false));
return PartialView(invoiceDetailsModel);
}
@ -237,8 +237,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
foreach (InvoiceDetail detail in invoice.InvoiceDetails)
{
data = await Provider.PartnerOperations.GetInvoiceLineItemsAsync(
invoiceId,
detail.BillingProvider,
invoiceId,
detail.BillingProvider,
detail.InvoiceLineItemType).ConfigureAwait(false);
lineItems.AddRange(data);

Просмотреть файл

@ -25,7 +25,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <summary>
/// Handles requests for the Manage views.
/// </summary>
[AuthorizationFilter(Roles = UserRole.Partner)]
[AuthorizationFilter(Roles = UserRoles.Partner)]
public class ManageController : BaseController
{
/// <summary>

Просмотреть файл

@ -40,31 +40,35 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
public async Task<PartialViewResult> GetOffersAsync(string customerId)
{
List<Offer> offers;
List<OfferModel> models;
OffersModel offersModel;
try
{
offers = await Provider.PartnerOperations.GetOffersAsync().ConfigureAwait(false);
offersModel = new OffersModel
offersModel = new OffersModel()
{
AvailableOffers = (from offer in offers
where offer.IsAvailableForPurchase
select new OfferModel()
{
Billing = offer.Billing,
Description = offer.Description,
Id = offer.Id,
IsAddOn = offer.IsAddOn,
IsAvailableForPurchase = offer.IsAvailableForPurchase,
MaximumQuantity = offer.MaximumQuantity,
MinimumQuantity = offer.MinimumQuantity,
Name = offer.Name,
PrerequisiteOffers = offer.PrerequisiteOffers
}).ToList(),
CustomerId = customerId
};
models = (from offer in offers
where offer.IsAvailableForPurchase
select new OfferModel()
{
Billing = offer.Billing,
Description = offer.Description,
Id = offer.Id,
IsAddOn = offer.IsAddOn,
IsAvailableForPurchase = offer.IsAvailableForPurchase,
MaximumQuantity = offer.MaximumQuantity,
MinimumQuantity = offer.MinimumQuantity,
Name = offer.Name,
PrerequisiteOffers = offer.PrerequisiteOffers
}).ToList();
offersModel.AvailableOffers.AddRange(models);
return PartialView("Offers", offersModel);
}
finally
@ -94,7 +98,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
offers = await Provider.PartnerOperations.GetOffersAsync().ConfigureAwait(false);
return Json(
offers.Single(x => x.Id.Equals(offerId, StringComparison.CurrentCultureIgnoreCase)),
offers.Single(x => x.Id.Equals(offerId, StringComparison.CurrentCultureIgnoreCase)),
JsonRequestBehavior.AllowGet);
}
finally

Просмотреть файл

@ -19,7 +19,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <summary>
/// Handles all request for Service Requests views.
/// </summary>
[AuthorizationFilter(Roles = UserRole.Partner)]
[AuthorizationFilter(Roles = UserRoles.Partner)]
public class ServiceRequestsController : BaseController
{
/// <summary>
@ -47,10 +47,9 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <returns>The HTML template for the list view.</returns>
public async Task<PartialViewResult> List()
{
ServiceRequestsModel serviceRequestsModel = new ServiceRequestsModel()
{
ServiceRequests = await GetServiceRequestsAsync().ConfigureAwait(false)
};
ServiceRequestsModel serviceRequestsModel = new ServiceRequestsModel();
serviceRequestsModel.ServiceRequests.AddRange(await GetServiceRequestsAsync().ConfigureAwait(false));
return PartialView(serviceRequestsModel);
}

Просмотреть файл

@ -24,7 +24,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <summary>
/// Handles request for the Subscriptions views.
/// </summary>
[AuthorizationFilter(Roles = UserRole.Partner)]
[AuthorizationFilter(Roles = UserRoles.Partner)]
public class SubscriptionsController : BaseController
{
/// <summary>
@ -213,10 +213,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
try
{
subscriptions = await Provider.PartnerOperations.GetSubscriptionsAsync(customerId).ConfigureAwait(false);
subscriptionsModel = new SubscriptionsModel()
{
Subscriptions = new List<SubscriptionModel>()
};
subscriptionsModel = new SubscriptionsModel();
foreach (Subscription s in subscriptions.Where(x => x.Status != SubscriptionStatus.Deleted))
{

Просмотреть файл

@ -19,7 +19,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <summary>
/// Controller for all Usage views.
/// </summary>
[AuthorizationFilter(Roles = UserRole.Partner)]
[AuthorizationFilter(Roles = UserRoles.Partner)]
public class UsageController : BaseController
{
/// <summary>
@ -60,10 +60,12 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
CustomerId = customerId,
SubscriptionId = subscriptionId,
SubscriptionFriendlyName = subscription.FriendlyName,
Usage = await Provider.PartnerOperations
.GetSubscriptionUsageAsync(customerId, subscriptionId, DateTime.Now.AddMonths(-1), DateTime.Now).ConfigureAwait(false)
};
usageModel.Usage.AddRange(await Provider.PartnerOperations
.GetSubscriptionUsageAsync(customerId, subscriptionId, DateTime.Now.AddMonths(-1), DateTime.Now)
.ConfigureAwait(false));
return View(usageModel);
}
finally

Просмотреть файл

@ -24,7 +24,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
/// <summary>
/// Controller for Users views.
/// </summary>
[AuthorizationFilter(Roles = UserRole.Partner)]
[AuthorizationFilter(Roles = UserRoles.Partner)]
public class UsersController : BaseController
{
/// <summary>
@ -90,9 +90,10 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
UsersModel usersModel = new UsersModel()
{
CustomerId = newUserModel.CustomerId,
Users = await client.GetUsersAsync().ConfigureAwait(false)
};
usersModel.Users.AddRange(await client.GetUsersAsync().ConfigureAwait(false));
return PartialView("List", usersModel);
}
finally
@ -154,12 +155,13 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
DisplayName = customerUser.DisplayName,
FirstName = customerUser.FirstName,
LastName = customerUser.LastName,
Licenses = await GetLicenses(customerId, userId),
UsageLocation = "US",
UserId = userId,
UserPrincipalName = customerUser.UserPrincipalName
};
editUserModel.Licenses.AddRange(await GetLicenses(customerId, userId).ConfigureAwait(false));
return PartialView(editUserModel);
}
finally
@ -202,9 +204,10 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
UsersModel usersModel = new UsersModel()
{
CustomerId = editUserModel.CustomerId,
Users = await client.GetUsersAsync().ConfigureAwait(false)
};
usersModel.Users.AddRange(await client.GetUsersAsync().ConfigureAwait(false));
return PartialView("List", usersModel);
}
finally
@ -235,9 +238,10 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
UsersModel usersModel = new UsersModel()
{
CustomerId = customerId,
Users = await client.GetUsersAsync().ConfigureAwait(false)
};
usersModel.Users.AddRange(await client.GetUsersAsync().ConfigureAwait(false));
return PartialView(usersModel);
}
finally
@ -276,7 +280,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
ConsumedUnits = sku.ConsumedUnits,
Id = sku.ProductSku.Id,
IsAssigned = licenses.Items
.SingleOrDefault(x => x.ProductSku.Name.Equals(sku.ProductSku.Name)) != null ? true : false,
.SingleOrDefault(x => x.ProductSku.Name.Equals(sku.ProductSku.Name, StringComparison.InvariantCultureIgnoreCase)) != null ? true : false,
Name = sku.ProductSku.Name,
SkuPartNumber = sku.ProductSku.SkuPartNumber,
TargetType = sku.ProductSku.TargetType,
@ -327,7 +331,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Controllers
if (!item.IsAssigned && license.IsAssigned)
{
assignments.Add(new LicenseAssignment() { ExcludedPlans = null, SkuId = license.Id });
assignments.Add(new LicenseAssignment { ExcludedPlans = null, SkuId = license.Id });
}
else if (item.IsAssigned && !license.IsAssigned)
{

Просмотреть файл

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\..\packages\Microsoft.Net.Compilers.2.7.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\..\packages\Microsoft.Net.Compilers.2.7.0\build\Microsoft.Net.Compilers.props')" />
<Import Project="..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.8\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.8\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
<Import Project="..\..\packages\Text.Analyzers.2.6.1\build\Text.Analyzers.props" Condition="Exists('..\..\packages\Text.Analyzers.2.6.1\build\Text.Analyzers.props')" />
<Import Project="..\..\packages\Microsoft.NetFramework.Analyzers.2.6.1\build\Microsoft.NetFramework.Analyzers.props" Condition="Exists('..\..\packages\Microsoft.NetFramework.Analyzers.2.6.1\build\Microsoft.NetFramework.Analyzers.props')" />
<Import Project="..\..\packages\Microsoft.NetCore.Analyzers.2.6.1\build\Microsoft.NetCore.Analyzers.props" Condition="Exists('..\..\packages\Microsoft.NetCore.Analyzers.2.6.1\build\Microsoft.NetCore.Analyzers.props')" />
<Import Project="..\..\packages\Microsoft.CodeQuality.Analyzers.2.6.1\build\Microsoft.CodeQuality.Analyzers.props" Condition="Exists('..\..\packages\Microsoft.CodeQuality.Analyzers.2.6.1\build\Microsoft.CodeQuality.Analyzers.props')" />
<Import Project="..\..\packages\Microsoft.Net.Compilers.2.8.2\build\Microsoft.Net.Compilers.props" Condition="Exists('..\..\packages\Microsoft.Net.Compilers.2.8.2\build\Microsoft.Net.Compilers.props')" />
<Import Project="..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\build\net46\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\build\net46\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props')" />
<Import Project="..\packages\Microsoft.Net.Compilers.1.3.2\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.1.3.2\build\Microsoft.Net.Compilers.props')" />
<Import Project="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
@ -56,43 +60,43 @@
<HintPath>..\..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll</HintPath>
</Reference>
<Reference Include="CommonServiceLocator, Version=2.0.3.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
<HintPath>..\..\packages\Unity.5.7.3\lib\net46\CommonServiceLocator.dll</HintPath>
<HintPath>..\..\packages\Unity.5.8.6\lib\net46\CommonServiceLocator.dll</HintPath>
</Reference>
<Reference Include="CsvHelper, Version=7.0.0.0, Culture=neutral, PublicKeyToken=8c4959082be5c823, processorArchitecture=MSIL">
<HintPath>..\..\packages\CsvHelper.7.1.0\lib\net45\CsvHelper.dll</HintPath>
<HintPath>..\..\packages\CsvHelper.7.1.1\lib\net45\CsvHelper.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AI.Agent.Intercept, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.Agent.Intercept.2.4.0\lib\net45\Microsoft.AI.Agent.Intercept.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AI.DependencyCollector, Version=2.5.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.DependencyCollector.2.5.1\lib\net45\Microsoft.AI.DependencyCollector.dll</HintPath>
<Reference Include="Microsoft.AI.DependencyCollector, Version=2.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.DependencyCollector.2.6.4\lib\net45\Microsoft.AI.DependencyCollector.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AI.PerfCounterCollector, Version=2.5.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.PerfCounterCollector.2.5.1\lib\net45\Microsoft.AI.PerfCounterCollector.dll</HintPath>
<Reference Include="Microsoft.AI.PerfCounterCollector, Version=2.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.PerfCounterCollector.2.6.4\lib\net45\Microsoft.AI.PerfCounterCollector.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AI.ServerTelemetryChannel, Version=2.5.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.2.5.1\lib\net45\Microsoft.AI.ServerTelemetryChannel.dll</HintPath>
<Reference Include="Microsoft.AI.ServerTelemetryChannel, Version=2.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.2.6.4\lib\net45\Microsoft.AI.ServerTelemetryChannel.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AI.Web, Version=2.5.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.Web.2.5.1\lib\net45\Microsoft.AI.Web.dll</HintPath>
<Reference Include="Microsoft.AI.Web, Version=2.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.Web.2.6.4\lib\net45\Microsoft.AI.Web.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AI.WindowsServer, Version=2.5.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.WindowsServer.2.5.1\lib\net45\Microsoft.AI.WindowsServer.dll</HintPath>
<Reference Include="Microsoft.AI.WindowsServer, Version=2.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.WindowsServer.2.6.4\lib\net45\Microsoft.AI.WindowsServer.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ApplicationInsights, Version=2.5.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.2.5.1\lib\net46\Microsoft.ApplicationInsights.dll</HintPath>
<Reference Include="Microsoft.ApplicationInsights, Version=2.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.2.6.4\lib\net46\Microsoft.ApplicationInsights.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ApplicationInsights.SnapshotCollector, Version=1.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.SnapshotCollector.1.2.0\lib\net45\Microsoft.ApplicationInsights.SnapshotCollector.dll</HintPath>
<Reference Include="Microsoft.ApplicationInsights.SnapshotCollector, Version=1.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.ApplicationInsights.SnapshotCollector.1.3.0\lib\net45\Microsoft.ApplicationInsights.SnapshotCollector.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AspNet.TelemetryCorrelation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.AspNet.TelemetryCorrelation.1.0.0\lib\net45\Microsoft.AspNet.TelemetryCorrelation.dll</HintPath>
<Reference Include="Microsoft.AspNet.TelemetryCorrelation, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.AspNet.TelemetryCorrelation.1.0.3\lib\net45\Microsoft.AspNet.TelemetryCorrelation.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.KeyVault, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Azure.KeyVault.2.3.2\lib\net452\Microsoft.Azure.KeyVault.dll</HintPath>
<Reference Include="Microsoft.Azure.KeyVault, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Azure.KeyVault.3.0.0\lib\net452\Microsoft.Azure.KeyVault.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.KeyVault.WebKey, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Azure.KeyVault.WebKey.2.0.7\lib\net452\Microsoft.Azure.KeyVault.WebKey.dll</HintPath>
<Reference Include="Microsoft.Azure.KeyVault.WebKey, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Azure.KeyVault.WebKey.3.0.0\lib\net452\Microsoft.Azure.KeyVault.WebKey.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.Management.ResourceManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Azure.Management.ResourceManager.1.6.0-preview\lib\net452\Microsoft.Azure.Management.ResourceManager.dll</HintPath>
@ -100,8 +104,8 @@
<Reference Include="Microsoft.Azure.Services.AppAuthentication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Azure.Services.AppAuthentication.1.1.0-preview\lib\net452\Microsoft.Azure.Services.AppAuthentication.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.8\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll</HintPath>
<Reference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.Data.Edm, Version=5.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
@ -113,32 +117,35 @@
<Reference Include="Microsoft.Data.Services.Client, Version=5.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Data.Services.Client.5.8.3\lib\net40\Microsoft.Data.Services.Client.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Graph, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Graph.1.8.0\lib\net45\Microsoft.Graph.dll</HintPath>
<Reference Include="Microsoft.Graph, Version=1.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Graph.1.9.0\lib\net45\Microsoft.Graph.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Graph.Core, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Graph.Core.1.8.1\lib\net45\Microsoft.Graph.Core.dll</HintPath>
<Reference Include="Microsoft.Graph.Core, Version=1.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Graph.Core.1.9.0\lib\net45\Microsoft.Graph.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Clients.ActiveDirectory, Version=3.19.2.6005, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.19.2\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll</HintPath>
<Reference Include="Microsoft.IdentityModel.Clients.ActiveDirectory, Version=3.19.8.16603, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.19.8\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Clients.ActiveDirectory.Platform, Version=3.19.2.6005, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.19.2\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll</HintPath>
<Reference Include="Microsoft.IdentityModel.Clients.ActiveDirectory.Platform, Version=3.19.8.16603, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.19.8\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Logging, Version=5.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Logging.5.2.1\lib\net451\Microsoft.IdentityModel.Logging.dll</HintPath>
<Reference Include="Microsoft.IdentityModel.JsonWebTokens, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.JsonWebTokens.5.2.4\lib\net451\Microsoft.IdentityModel.JsonWebTokens.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Logging, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Logging.5.2.4\lib\net451\Microsoft.IdentityModel.Logging.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\lib\net45\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Protocols, Version=5.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Protocols.5.2.1\lib\net451\Microsoft.IdentityModel.Protocols.dll</HintPath>
<Reference Include="Microsoft.IdentityModel.Protocols, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Protocols.5.2.4\lib\net451\Microsoft.IdentityModel.Protocols.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect, Version=5.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.5.2.1\lib\net451\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>
<Reference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.5.2.4\lib\net451\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Tokens, Version=5.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Tokens.5.2.1\lib\net451\Microsoft.IdentityModel.Tokens.dll</HintPath>
<Reference Include="Microsoft.IdentityModel.Tokens, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.IdentityModel.Tokens.5.2.4\lib\net451\Microsoft.IdentityModel.Tokens.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Owin, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Owin.4.0.0\lib\net451\Microsoft.Owin.dll</HintPath>
@ -161,14 +168,14 @@
<Reference Include="Microsoft.Rest.ClientRuntime.Azure, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Rest.ClientRuntime.Azure.3.3.12\lib\net452\Microsoft.Rest.ClientRuntime.Azure.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Store.PartnerCenter, Version=1.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Store.PartnerCenter.1.7.1\lib\Net45\Microsoft.Store.PartnerCenter.dll</HintPath>
<Reference Include="Microsoft.Store.PartnerCenter, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Store.PartnerCenter.1.8.0\lib\Net45\Microsoft.Store.PartnerCenter.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Store.PartnerCenter.Extensions, Version=1.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Store.PartnerCenter.1.7.1\lib\Net45\Microsoft.Store.PartnerCenter.Extensions.dll</HintPath>
<Reference Include="Microsoft.Store.PartnerCenter.Extensions, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Store.PartnerCenter.1.8.0\lib\Net45\Microsoft.Store.PartnerCenter.Extensions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Store.PartnerCenter.Models, Version=1.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Store.PartnerCenter.1.7.1\lib\Net45\Microsoft.Store.PartnerCenter.Models.dll</HintPath>
<Reference Include="Microsoft.Store.PartnerCenter.Models, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Store.PartnerCenter.1.8.0\lib\Net45\Microsoft.Store.PartnerCenter.Models.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll</HintPath>
@ -183,7 +190,7 @@
<HintPath>..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<HintPath>..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
<HintPath>..\..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
@ -193,13 +200,13 @@
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.2.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Diagnostics.DiagnosticSource.4.4.1\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Diagnostics.DiagnosticSource.4.5.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.IdentityModel" />
<Reference Include="System.IdentityModel.Tokens.Jwt, Version=5.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.IdentityModel.Tokens.Jwt.5.2.1\lib\net451\System.IdentityModel.Tokens.Jwt.dll</HintPath>
<Reference Include="System.IdentityModel.Tokens.Jwt, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.IdentityModel.Tokens.Jwt.5.2.4\lib\net451\System.IdentityModel.Tokens.Jwt.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
@ -245,54 +252,54 @@
<Reference Include="System.Web.Abstractions" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.AspNet.WebPages.3.2.4\lib\net45\System.Web.Helpers.dll</HintPath>
<HintPath>..\..\packages\Microsoft.AspNet.WebPages.3.2.6\lib\net45\System.Web.Helpers.dll</HintPath>
</Reference>
<Reference Include="System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.AspNet.Mvc.5.2.4\lib\net45\System.Web.Mvc.dll</HintPath>
<Reference Include="System.Web.Mvc, Version=5.2.6.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.AspNet.Mvc.5.2.6\lib\net45\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll</HintPath>
</Reference>
<Reference Include="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.AspNet.Razor.3.2.4\lib\net45\System.Web.Razor.dll</HintPath>
<HintPath>..\..\packages\Microsoft.AspNet.Razor.3.2.6\lib\net45\System.Web.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Web.Routing" />
<Reference Include="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.AspNet.WebPages.3.2.4\lib\net45\System.Web.WebPages.dll</HintPath>
<HintPath>..\..\packages\Microsoft.AspNet.WebPages.3.2.6\lib\net45\System.Web.WebPages.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Deployment, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.AspNet.WebPages.3.2.4\lib\net45\System.Web.WebPages.Deployment.dll</HintPath>
<HintPath>..\..\packages\Microsoft.AspNet.WebPages.3.2.6\lib\net45\System.Web.WebPages.Deployment.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.AspNet.WebPages.3.2.4\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
<HintPath>..\..\packages\Microsoft.AspNet.WebPages.3.2.6\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Configuration" />
<Reference Include="System.Web.Services" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="Unity.Abstractions, Version=3.3.0.0, Culture=neutral, PublicKeyToken=6d32ff45e0ccc69f, processorArchitecture=MSIL">
<HintPath>..\..\packages\Unity.Abstractions.3.3.0\lib\net45\Unity.Abstractions.dll</HintPath>
<HintPath>..\..\packages\Unity.5.8.6\lib\net46\Unity.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Unity.Configuration, Version=5.2.1.0, Culture=neutral, PublicKeyToken=6d32ff45e0ccc69f, processorArchitecture=MSIL">
<HintPath>..\..\packages\Unity.5.7.3\lib\net46\Unity.Configuration.dll</HintPath>
<HintPath>..\..\packages\Unity.5.8.6\lib\net46\Unity.Configuration.dll</HintPath>
</Reference>
<Reference Include="Unity.Container, Version=5.7.3.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
<HintPath>..\..\packages\Unity.Container.5.7.3\lib\net46\Unity.Container.dll</HintPath>
<Reference Include="Unity.Container, Version=5.8.6.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
<HintPath>..\..\packages\Unity.Container.5.8.6\lib\net46\Unity.Container.dll</HintPath>
</Reference>
<Reference Include="Unity.Interception, Version=5.5.1.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
<HintPath>..\..\packages\Unity.5.7.3\lib\net46\Unity.Interception.dll</HintPath>
<HintPath>..\..\packages\Unity.5.8.6\lib\net46\Unity.Interception.dll</HintPath>
</Reference>
<Reference Include="Unity.Interception.Configuration, Version=5.1.4.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
<HintPath>..\..\packages\Unity.5.7.3\lib\net46\Unity.Interception.Configuration.dll</HintPath>
<HintPath>..\..\packages\Unity.5.8.6\lib\net46\Unity.Interception.Configuration.dll</HintPath>
</Reference>
<Reference Include="Unity.Mvc, Version=5.0.13.0, Culture=neutral, PublicKeyToken=6d32ff45e0ccc69f, processorArchitecture=MSIL">
<HintPath>..\..\packages\Unity.Mvc.5.0.13\lib\net46\Unity.Mvc.dll</HintPath>
</Reference>
<Reference Include="Unity.RegistrationByConvention, Version=2.1.5.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
<HintPath>..\..\packages\Unity.5.7.3\lib\net46\Unity.RegistrationByConvention.dll</HintPath>
<HintPath>..\..\packages\Unity.5.8.6\lib\net46\Unity.RegistrationByConvention.dll</HintPath>
</Reference>
<Reference Include="Unity.ServiceLocation, Version=2.1.2.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
<HintPath>..\..\packages\Unity.5.7.3\lib\net46\Unity.ServiceLocation.dll</HintPath>
<HintPath>..\..\packages\Unity.5.8.6\lib\net46\Unity.ServiceLocation.dll</HintPath>
</Reference>
<Reference Include="WebActivatorEx, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7b26dc2a43f6a0d4, processorArchitecture=MSIL">
<HintPath>..\..\packages\WebActivatorEx.2.2.0\lib\net40\WebActivatorEx.dll</HintPath>
@ -389,9 +396,9 @@
<Compile Include="Logic\Office\StatusDetails.cs" />
<Compile Include="Logic\GraphClient.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Security\AuthenticationFilter.cs" />
<Compile Include="Security\AuthenticationFilterAttribute.cs" />
<Compile Include="Security\CustomerPrincipal.cs" />
<Compile Include="Security\UserRole.cs" />
<Compile Include="Security\UserRoles.cs" />
<Compile Include="Startup.cs" />
<Compile Include="Subscriptions\AzureSubscriptionDetails.cs" />
<Compile Include="Subscriptions\ISubscriptionDetails.cs" />
@ -470,7 +477,6 @@
<Content Include="Content\bootstrap-theme.min.css.map" />
<Content Include="Content\bootstrap-theme.css.map" />
<None Include="packages.config" />
<None Include="Properties\PublishProfiles\partnercenterexplorer - Web Deploy.pubxml" />
<None Include="Scripts\jquery-2.2.3.intellisense.js" />
<Content Include="Scripts\ai.0.22.9-build00167.js" />
<Content Include="Scripts\ai.0.22.9-build00167.min.js" />
@ -486,9 +492,9 @@
<Content Include="Scripts\jquery-3.3.1.slim.min.js" />
<Content Include="Scripts\jquery-ui-1.12.1.js" />
<Content Include="Scripts\jquery-ui-1.12.1.min.js" />
<None Include="Scripts\jquery.validate-vsdoc.js" />
<Content Include="Scripts\jquery.unobtrusive-ajax.js" />
<Content Include="Scripts\jquery.unobtrusive-ajax.min.js" />
<None Include="Scripts\jquery.validate-vsdoc.js" />
<Content Include="Scripts\jquery.validate.js" />
<Content Include="Scripts\jquery.validate.min.js" />
<Content Include="Scripts\jquery.validate.unobtrusive.js" />
@ -570,6 +576,16 @@
<ItemGroup>
<Service Include="{4A0DDDB5-7A95-4FBF-97CC-616D07737A77}" />
</ItemGroup>
<ItemGroup>
<Analyzer Include="..\..\packages\Microsoft.CodeQuality.Analyzers.2.6.1\analyzers\dotnet\cs\Microsoft.CodeQuality.Analyzers.dll" />
<Analyzer Include="..\..\packages\Microsoft.CodeQuality.Analyzers.2.6.1\analyzers\dotnet\cs\Microsoft.CodeQuality.CSharp.Analyzers.dll" />
<Analyzer Include="..\..\packages\Microsoft.NetCore.Analyzers.2.6.1\analyzers\dotnet\cs\Microsoft.NetCore.Analyzers.dll" />
<Analyzer Include="..\..\packages\Microsoft.NetCore.Analyzers.2.6.1\analyzers\dotnet\cs\Microsoft.NetCore.CSharp.Analyzers.dll" />
<Analyzer Include="..\..\packages\Microsoft.NetFramework.Analyzers.2.6.1\analyzers\dotnet\cs\Microsoft.NetFramework.Analyzers.dll" />
<Analyzer Include="..\..\packages\Microsoft.NetFramework.Analyzers.2.6.1\analyzers\dotnet\cs\Microsoft.NetFramework.CSharp.Analyzers.dll" />
<Analyzer Include="..\..\packages\Text.Analyzers.2.6.1\analyzers\dotnet\cs\Text.Analyzers.dll" />
<Analyzer Include="..\..\packages\Text.Analyzers.2.6.1\analyzers\dotnet\cs\Text.CSharp.Analyzers.dll" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
@ -597,12 +613,14 @@
</PropertyGroup>
<Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.Azure.Services.AppAuthentication.1.1.0-preview\build\Microsoft.Azure.Services.AppAuthentication.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Azure.Services.AppAuthentication.1.1.0-preview\build\Microsoft.Azure.Services.AppAuthentication.targets'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.8\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.8\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.ApplicationInsights.SnapshotCollector.1.2.0\build\Microsoft.ApplicationInsights.SnapshotCollector.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.ApplicationInsights.SnapshotCollector.1.2.0\build\Microsoft.ApplicationInsights.SnapshotCollector.targets'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.Net.Compilers.2.7.0\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Net.Compilers.2.7.0\build\Microsoft.Net.Compilers.props'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\build\net46\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\build\net46\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.Net.Compilers.2.8.2\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Net.Compilers.2.8.2\build\Microsoft.Net.Compilers.props'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.CodeQuality.Analyzers.2.6.1\build\Microsoft.CodeQuality.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.CodeQuality.Analyzers.2.6.1\build\Microsoft.CodeQuality.Analyzers.props'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.NetCore.Analyzers.2.6.1\build\Microsoft.NetCore.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.NetCore.Analyzers.2.6.1\build\Microsoft.NetCore.Analyzers.props'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.NetFramework.Analyzers.2.6.1\build\Microsoft.NetFramework.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.NetFramework.Analyzers.2.6.1\build\Microsoft.NetFramework.Analyzers.props'))" />
<Error Condition="!Exists('..\..\packages\Text.Analyzers.2.6.1\build\Text.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Text.Analyzers.2.6.1\build\Text.Analyzers.props'))" />
</Target>
<Import Project="..\..\packages\Microsoft.Azure.Services.AppAuthentication.1.1.0-preview\build\Microsoft.Azure.Services.AppAuthentication.targets" Condition="Exists('..\..\packages\Microsoft.Azure.Services.AppAuthentication.1.1.0-preview\build\Microsoft.Azure.Services.AppAuthentication.targets')" />
<Import Project="..\..\packages\Microsoft.ApplicationInsights.SnapshotCollector.1.2.0\build\Microsoft.ApplicationInsights.SnapshotCollector.targets" Condition="Exists('..\..\packages\Microsoft.ApplicationInsights.SnapshotCollector.1.2.0\build\Microsoft.ApplicationInsights.SnapshotCollector.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

Просмотреть файл

@ -81,7 +81,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Azure
/// or
/// <paramref name="templateUri"/> is empty or null.
/// </exception>
public async Task<string> ApplyTemplateAsync(string subscriptionId, string resourceGroupName, string templateUri, string parametersUri)
public async Task<string> ApplyTemplateAsync(string subscriptionId, string resourceGroupName, Uri templateUri, Uri parametersUri)
{
Deployment deployment;
DeploymentExtended result;
@ -89,7 +89,6 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Azure
subscriptionId.AssertNotEmpty(nameof(subscriptionId));
resourceGroupName.AssertNotEmpty(nameof(resourceGroupName));
templateUri.AssertNotEmpty(nameof(templateUri));
try
{
@ -100,13 +99,13 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Azure
Properties = new DeploymentProperties()
{
Mode = DeploymentMode.Incremental,
TemplateLink = new TemplateLink(templateUri)
TemplateLink = new TemplateLink(templateUri.ToString())
}
};
if (!string.IsNullOrEmpty(parametersUri))
if (parametersUri != null)
{
deployment.Properties.ParametersLink = new ParametersLink(parametersUri);
deployment.Properties.ParametersLink = new ParametersLink(parametersUri.ToString());
}
deploymentName = Guid.NewGuid().ToString();

Просмотреть файл

@ -118,10 +118,12 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
}));
}
if (customerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (customerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
groups = directoryGroups.CurrentPage.OfType<Group>().Where(
g => g.DisplayName.Equals("AdminAgents") || g.DisplayName.Equals("HelpdeskAgents") || g.DisplayName.Equals("SalesAgent")).ToList();
g => g.DisplayName.Equals("AdminAgents", StringComparison.InvariantCultureIgnoreCase)
|| g.DisplayName.Equals("HelpdeskAgents", StringComparison.InvariantCultureIgnoreCase)
|| g.DisplayName.Equals("SalesAgent", StringComparison.InvariantCultureIgnoreCase)).ToList();
if (groups.Count > 0)
{

Просмотреть файл

@ -6,6 +6,7 @@
namespace Microsoft.Store.PartnerCenter.Explorer.Logic
{
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
@ -38,11 +39,11 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
/// <paramref name="token"/> is empty or null.
/// </exception>
/// <exception cref="CommunicationException"></exception>
public async Task<T> GetAsync<T>(string requestUri, string token)
public async Task<T> GetAsync<T>(Uri requestUri, string token)
{
HttpResponseMessage response;
requestUri.AssertNotEmpty(nameof(requestUri));
requestUri.AssertNotNull(nameof(requestUri));
token.AssertNotEmpty(nameof(token));
try

Просмотреть файл

@ -6,6 +6,7 @@
namespace Microsoft.Store.PartnerCenter.Explorer.Logic
{
using System;
using System.Threading.Tasks;
/// <summary>
@ -20,6 +21,6 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
/// <param name="requestUri">The Uri where the request should be sent.</param>
/// <param name="token">The access token value used to authorize the request.</param>
/// <returns>The task object representing the asynchronous operation.</returns>
Task<T> GetAsync<T>(string requestUri, string token);
Task<T> GetAsync<T>(Uri requestUri, string token);
}
}

Просмотреть файл

@ -14,6 +14,14 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Office
/// </summary>
public class OfficeHealthEvent : IHealthEvent
{
/// <summary>
/// Initializes a new instance of the <see cref="OfficeHealthEvent" /> class.
/// </summary>
public OfficeHealthEvent()
{
IncidentIds = new List<string>();
}
/// <summary>
/// Gets or sets the identifier.
/// </summary>
@ -27,7 +35,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Office
/// <summary>
/// Gets or sets a list of incidents.
/// </summary>
public List<string> IncidentIds { get; set; }
public List<string> IncidentIds { get; }
/// <summary>
/// Gets or sets the status of the <see cref="IHealthEvent" />.

Просмотреть файл

@ -6,6 +6,7 @@
namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Office
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
@ -56,13 +57,13 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Office
public async Task<List<IHealthEvent>> GetCurrentStatusAsync(string customerId)
{
Result<OfficeHealthEvent> records;
string requestUri;
Uri requestUri;
customerId.AssertNotEmpty(nameof(customerId));
try
{
requestUri = $"{provider.Configuration.OfficeManagementEndpoint}/api/v1.0/{customerId}/ServiceComms/CurrentStatus";
requestUri = new Uri($"{provider.Configuration.OfficeManagementEndpoint}/api/v1.0/{customerId}/ServiceComms/CurrentStatus");
records = await provider.Communication.GetAsync<Result<OfficeHealthEvent>>(
requestUri,

Просмотреть файл

@ -14,15 +14,23 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic.Office
/// </summary>
public class StatusDetails
{
/// <summary>
/// Initializes a new instance of the <see cref="StatusDetails" /> class.
/// </summary>
public StatusDetails()
{
IncidentIds = new List<string>();
}
/// <summary>
/// Gets or sets the identifier.
/// </summary>
public string Id { get; set; }
/// <summary>
/// Gets or sets the incident identifiers associated with this status.
/// Gets the incident identifiers associated with this status.
/// </summary>
public List<string> IncidentIds { get; set; }
public List<string> IncidentIds { get; }
/// <summary>
/// Gets or sets the status.

Просмотреть файл

@ -8,6 +8,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
{
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Security.Claims;
using System.Threading.Tasks;
using Cache;
@ -118,7 +119,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
{
{ "CustomerId", principal.CustomerId },
{ "Domain", domain },
{ "Exists", exists.ToString() },
{ "Exists", exists.ToString(CultureInfo.CurrentCulture) },
{ "Name", principal.Name },
{ "ParternCenterCorrelationId", correlationId.ToString() }
};
@ -164,7 +165,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
throw new UnauthorizedAccessException("You are not authorized to perform this operation.");
}
@ -225,9 +226,9 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
newEntity = await operations.Customers.ById(customerId).Orders.CreateAsync(newOrder);
newEntity = await operations.Customers.ById(customerId).Orders.CreateAsync(newOrder).ConfigureAwait(false);
}
else
{
@ -297,7 +298,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
user = await operations.Customers.ById(customerId).Users.CreateAsync(newEntity).ConfigureAwait(false);
}
@ -359,7 +360,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
throw new UnauthorizedAccessException("You are not authorized to perform this operation.");
}
@ -423,7 +424,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
throw new UnauthorizedAccessException("You are not authorized to perform this operation.");
}
@ -533,7 +534,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
customer = await operations.Customers.ById(customerId).GetAsync().ConfigureAwait(false);
}
@ -594,7 +595,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
customers = new List<Customer>();
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
seekCustomers = await operations.Customers.GetAsync().ConfigureAwait(false);
customersEnumerator = operations.Enumerators.Customers.Create(seekCustomers);
@ -667,8 +668,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId) ||
principal.CustomerId.Equals(customerId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase) ||
principal.CustomerId.Equals(customerId, StringComparison.InvariantCultureIgnoreCase))
{
skus = await operations.Customers.ById(customerId).SubscribedSkus.GetAsync().ConfigureAwait(false);
}
@ -731,7 +732,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
throw new UnauthorizedAccessException("You are not authorized to perform this operation.");
}
@ -793,7 +794,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
throw new UnauthorizedAccessException("You are not authorized to perform this operation.");
}
@ -849,7 +850,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (!principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
throw new UnauthorizedAccessException("You are not authorized to perform this operation.");
}
@ -909,7 +910,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
if (offers == null)
{
offers = await operations.Offers.ByCountry("US").GetAsync();
offers = await operations.Offers.ByCountry("US").GetAsync().ConfigureAwait(false);
await provider.Cache.StoreAsync(CacheDatabaseType.DataStructures, OffersKey, offers, TimeSpan.FromDays(1)).ConfigureAwait(false);
}
@ -962,7 +963,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
requests = await operations.ServiceRequests.GetAsync().ConfigureAwait(false);
}
@ -1029,7 +1030,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
subscription = await operations.Customers.ById(customerId).Subscriptions.ById(subscriptionId).GetAsync().ConfigureAwait(false);
}
@ -1091,7 +1092,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
subscriptions = await operations.Customers.ById(customerId).Subscriptions.GetAsync().ConfigureAwait(false);
}
@ -1159,7 +1160,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
usageRecords = new List<AzureUtilizationRecord>();
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
records = await operations.Customers.ById(customerId).Subscriptions.ById(subscriptionId)
.Utilization.Azure.QueryAsync(startTime, endTime).ConfigureAwait(false);
@ -1244,8 +1245,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId) ||
principal.CustomerId.Equals(customerId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase) ||
principal.CustomerId.Equals(customerId, StringComparison.InvariantCultureIgnoreCase))
{
user = await operations.Customers.ById(customerId).Users.ById(userId).GetAsync().ConfigureAwait(false);
}
@ -1312,8 +1313,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId) ||
principal.CustomerId.Equals(customerId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase) ||
principal.CustomerId.Equals(customerId, StringComparison.InvariantCultureIgnoreCase))
{
licenses = await operations.Customers.ById(customerId).Users.ById(userId).Licenses.GetAsync().ConfigureAwait(false);
}
@ -1381,7 +1382,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase))
{
updatedSubscription = await operations.Customers.ById(customerId).Subscriptions
.ById(subscription.Id).PatchAsync(subscription).ConfigureAwait(false);
@ -1446,8 +1447,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId) ||
principal.CustomerId.Equals(customerId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase) ||
principal.CustomerId.Equals(customerId, StringComparison.InvariantCultureIgnoreCase))
{
user = await operations.Customers.ById(customerId).Users.ById(userId).PatchAsync(entity).ConfigureAwait(false);
}
@ -1517,8 +1518,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
principal = new CustomerPrincipal(ClaimsPrincipal.Current);
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterApplicationTenantId) ||
principal.CustomerId.Equals(customerId))
if (principal.CustomerId.Equals(provider.Configuration.PartnerCenterAccountId, StringComparison.InvariantCultureIgnoreCase) ||
principal.CustomerId.Equals(customerId, StringComparison.InvariantCultureIgnoreCase))
{
await operations.Customers.ById(customerId).Users.ById(userId).LicenseUpdates.CreateAsync(entity).ConfigureAwait(false);
}
@ -1600,7 +1601,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
credentials = await PartnerCredentials.Instance.GenerateByApplicationCredentialsAsync(
provider.Configuration.PartnerCenterApplicationId,
provider.Configuration.PartnerCenterApplicationSecret.ToUnsecureString(),
provider.Configuration.PartnerCenterApplicationTenantId).ConfigureAwait(false);
provider.Configuration.PartnerCenterAccountId).ConfigureAwait(false);
await provider.Cache.StoreAsync(CacheDatabaseType.Authentication, PartnerCenterCacheKey, credentials).ConfigureAwait(false);
@ -1615,7 +1616,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Logic
private async Task<IPartner> GetUserOperationsAsync(Guid correlationId)
{
AuthenticationResult token = await provider.AccessToken.GetAccessTokenAsync(
$"{provider.Configuration.ActiveDirectoryEndpoint}/{provider.Configuration.PartnerCenterApplicationTenantId}",
$"{provider.Configuration.ActiveDirectoryEndpoint}/{provider.Configuration.PartnerCenterAccountId}",
provider.Configuration.PartnerCenterEndpoint,
new Models.ApplicationCredential
{

Просмотреть файл

@ -15,8 +15,16 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
public class ConfigurationRecordsModel
{
/// <summary>
/// Gets or sets the service configuration records.
/// Initializes a new instance of the <see cref="ConfigurationRecordsModel" /> class.
/// </summary>
public List<DomainDnsRecord> ServiceConfigurationRecords { get; set; }
public ConfigurationRecordsModel()
{
ServiceConfigurationRecords = new List<DomainDnsRecord>();
}
/// <summary>
/// Gets the service configuration records.
/// </summary>
public List<DomainDnsRecord> ServiceConfigurationRecords { get; }
}
}

Просмотреть файл

@ -14,9 +14,27 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
public class CustomersModel
{
/// <summary>
/// Gets or sets a collection of customer that belong to the configured partner.
/// Initializes a new instance of the <see cref="CustomerModel" /> class.
/// </summary>
public List<CustomerModel> Customers { get; set; }
public CustomersModel()
{
Customers = new List<CustomerModel>();
}
/// <summary>
/// Initializes a new instance of the <see cref="CustomerModel" /> class.
/// </summary>
/// <param name="items">Items to be added to the customers collection.</param>
public CustomersModel(IList<CustomerModel> items)
{
Customers = new List<CustomerModel>(items);
}
/// <summary>
/// Gets a collection of customer that belong to the configured partner.
/// </summary>
public List<CustomerModel> Customers { get; }
/// <summary>
/// Gets or sets a value indicating whether or not the configured tenant is the integration sandbox.

Просмотреть файл

@ -14,6 +14,14 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// </summary>
public class EditUserModel
{
/// <summary>
/// Initializes a new instance of the <see cref="EditUserModel" /> class.
/// </summary>
public EditUserModel()
{
Licenses = new List<LicenseModel>();
}
/// <summary>
/// Gets or sets the customer identifier.
/// </summary>
@ -43,7 +51,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// <summary>
/// Gets or sets licenses for the user.
/// </summary>
public List<LicenseModel> Licenses { get; set; }
public List<LicenseModel> Licenses { get; }
/// <summary>
/// Gets or sets the password.

Просмотреть файл

@ -14,10 +14,19 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// </summary>
public class InvoiceDetailsModel
{
/// <summary>
/// Initializes a new instance of the <see cref="InvoiceDetailsModel" /> class.
/// </summary>
public InvoiceDetailsModel()
{
Customers = new List<string>();
InvoiceLineItems = new List<InvoiceLineItem>();
}
/// <summary>
/// Gets or sets the customers.
/// </summary>
public List<string> Customers { get; set; }
public List<string> Customers { get; }
/// <summary>
/// Gets or sets the invoice identifier.
@ -27,6 +36,6 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// <summary>
/// Gets or sets the invoice line items.
/// </summary>
public List<InvoiceLineItem> InvoiceLineItems { get; set; }
public List<InvoiceLineItem> InvoiceLineItems { get; }
}
}

Просмотреть файл

@ -14,9 +14,17 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// </summary>
public class InvoicesModel
{
/// <summary>
/// Initializes a new instance of the <see cref="InvoicesModel" /> class.
/// </summary>
public InvoicesModel()
{
Invoices = new List<Invoice>();
}
/// <summary>
/// Gets or sets the invoices.
/// </summary>
public List<Invoice> Invoices { get; set; }
public List<Invoice> Invoices { get; }
}
}

Просмотреть файл

@ -6,6 +6,7 @@
namespace Microsoft.Store.PartnerCenter.Explorer.Models
{
using System;
using System.ComponentModel.DataAnnotations;
/// <summary>
@ -23,7 +24,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// </summary>
[Display(Name = "Parameters Link")]
[Required]
public string ParametersUri { get; set; }
public Uri ParametersUri { get; set; }
/// <summary>
/// Gets or sets the name of the resource group.
@ -40,6 +41,6 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// </summary>
[Display(Name = "Template Link")]
[Required]
public string TemplateUri { get; set; }
public Uri TemplateUri { get; set; }
}
}

Просмотреть файл

@ -14,10 +14,19 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// </summary>
public class NewSubscriptionModel
{
/// <summary>
/// Initializes a new instance of the <see cref="NewSubscriptionModel" /> class.
/// </summary>
public NewSubscriptionModel()
{
AvailableOffers = new List<OfferModel>();
LineItems = new List<OrderLineItem>();
}
/// <summary>
/// Gets or sets the collection available offers.
/// </summary>
public List<OfferModel> AvailableOffers { get; set; }
public List<OfferModel> AvailableOffers { get; }
/// <summary>
/// Gets or sets the customer identifier.
@ -27,6 +36,6 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// <summary>
/// Gets or sets the order line items.
/// </summary>
public List<OrderLineItem> LineItems { get; set; }
public List<OrderLineItem> LineItems { get; }
}
}

Просмотреть файл

@ -14,9 +14,17 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
public class OffersModel
{
/// <summary>
/// Gets or sets the available offers from Partner Center.
/// Initializes a new instance of the <see cref="OffersModel" /> class.
/// </summary>
public List<OfferModel> AvailableOffers { get; set; }
public OffersModel()
{
AvailableOffers = new List<OfferModel>();
}
/// <summary>
/// Gets the available offers from Partner Center.
/// </summary>
public List<OfferModel> AvailableOffers { get; }
/// <summary>
/// Gets or sets the customer identifier.

Просмотреть файл

@ -14,8 +14,16 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
public class ServiceRequestsModel
{
/// <summary>
/// Gets or sets the service requests.
/// Initializes a new instance of the <see cref="ServiceRequestsModel" /> class.
/// </summary>
public List<ServiceRequestModel> ServiceRequests { get; set; }
public ServiceRequestsModel()
{
ServiceRequests = new List<ServiceRequestModel>();
}
/// <summary>
/// Gets the service requests.
/// </summary>
public List<ServiceRequestModel> ServiceRequests { get; }
}
}

Просмотреть файл

@ -14,6 +14,14 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// </summary>
public class SubscriptionHealthModel
{
/// <summary>
/// Initializes a new instance of the <see cref="SubscriptionHealthModel" /> class.
/// </summary>
public SubscriptionHealthModel()
{
HealthEvents = new List<IHealthEvent>();
}
/// <summary>
/// Gets or sets the name of the company.
/// </summary>
@ -32,7 +40,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// <summary>
/// Gets or sets the health events.
/// </summary>
public List<IHealthEvent> HealthEvents { get; set; }
public List<IHealthEvent> HealthEvents { get; }
/// <summary>
/// Gets or sets the subscription identifier.

Просмотреть файл

@ -14,8 +14,16 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
public class SubscriptionsModel
{
/// <summary>
/// Gets or sets the list of subscriptions owned by the customer.
/// Initializes a new instance of the <see cref="SubscriptionsModel" /> class.
/// </summary>
public List<SubscriptionModel> Subscriptions { get; set; }
public SubscriptionsModel()
{
Subscriptions = new List<SubscriptionModel>();
}
/// <summary>
/// Gets the list of subscriptions owned by the customer.
/// </summary>
public List<SubscriptionModel> Subscriptions { get; }
}
}

Просмотреть файл

@ -14,6 +14,14 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// </summary>
public class UsageModel
{
/// <summary>
/// Initializes a new instance of the <see cref="UsageModel" /> class.
/// </summary>
public UsageModel()
{
Usage = new List<AzureUtilizationRecord>();
}
/// <summary>
/// Gets or sets the name of the company.
/// </summary>
@ -35,8 +43,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
public string SubscriptionFriendlyName { get; set; }
/// <summary>
/// Gets or sets the utilization records for the subscription.
/// Gets the utilization records for the subscription.
/// </summary>
public List<AzureUtilizationRecord> Usage { get; set; }
public List<AzureUtilizationRecord> Usage { get; }
}
}

Просмотреть файл

@ -13,14 +13,22 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Models
/// </summary>
public class UsersModel
{
/// <summary>
/// Initializes a new instance of the <see cref="UsersModel" /> class.
/// </summary>
public UsersModel()
{
Users = new List<UserModel>();
}
/// <summary>
/// Gets or sets the customer identifier.
/// </summary>
public string CustomerId { get; set; }
/// <summary>
/// Gets or sets a collection of users that belong to a specific customer.
/// Gets a collection of users that belong to a specific customer.
/// </summary>
public List<UserModel> Users { get; set; }
public List<UserModel> Users { get; }
}
}

Просмотреть файл

@ -6,7 +6,6 @@
namespace Microsoft.Store.PartnerCenter.Explorer.Providers
{
using System;
using System.Configuration;
using System.Security;
using System.Threading.Tasks;
@ -76,16 +75,16 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
/// </summary>
public string KeyVaultEndpoint { get; private set; }
/// <summary>
/// Gets a value indicating whether or not the reseller tenant is the TIP tenant.
/// </summary>
public bool IsIntegrationSandbox => Convert.ToBoolean(ConfigurationManager.AppSettings["IsIntegrationSandbox"]);
/// <summary>
/// Gets the Office 365 Management endpoint address.
/// </summary>
public string OfficeManagementEndpoint { get; private set; }
/// <summary>
/// Gets the Partner Center application tenant identifier.
/// </summary>
public string PartnerCenterAccountId { get; private set; }
/// <summary>
/// Gets the Partner Center application identifier.
/// </summary>
@ -96,11 +95,6 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
/// </summary>
public SecureString PartnerCenterApplicationSecret { get; private set; }
/// <summary>
/// Gets the Partner Center application tenant identifier.
/// </summary>
public string PartnerCenterApplicationTenantId { get; private set; }
/// <summary>
/// Gets the Partner Center endpoint address.
/// </summary>
@ -117,7 +111,6 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
/// <returns>An instance of the <see cref="Task"/> class that represents the asynchronous operation.</returns>
public async Task InitializeAsync()
{
ActiveDirectoryEndpoint = ConfigurationManager.AppSettings["ActiveDirectoryEndpoint"];
ApplicationId = ConfigurationManager.AppSettings["ApplicationId"];
ApplicationTenantId = ConfigurationManager.AppSettings["ApplicationTenantId"];
@ -126,8 +119,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
InstrumentationKey = ConfigurationManager.AppSettings["InstrumentationKey"];
KeyVaultEndpoint = ConfigurationManager.AppSettings["KeyVaultEndpoint"];
OfficeManagementEndpoint = ConfigurationManager.AppSettings["OfficeManagementEndpoint"];
PartnerCenterAccountId = ConfigurationManager.AppSettings["PartnerCenterAccountId"];
PartnerCenterApplicationId = ConfigurationManager.AppSettings["PartnerCenterApplicationId"];
PartnerCenterApplicationTenantId = ConfigurationManager.AppSettings["PartnerCenterApplicationTenantId"];
PartnerCenterEndpoint = ConfigurationManager.AppSettings["PartnerCenterEndpoint"];
ApplicationSecret = await service.Vault.GetAsync("ApplicationSecret").ConfigureAwait(false);

Просмотреть файл

@ -49,11 +49,6 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
/// </summary>
string InstrumentationKey { get; }
/// <summary>
/// Gets a value indicating whether or not the reseller tenant is the TIP tenant.
/// </summary>
bool IsIntegrationSandbox { get; }
/// <summary>
/// Gets the endpoint address for the instance of Key Vault.
/// </summary>
@ -64,6 +59,11 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
/// </summary>
string OfficeManagementEndpoint { get; }
/// <summary>
/// Gets the Partner Center application tenant identifier.
/// </summary>
string PartnerCenterAccountId { get; }
/// <summary>
/// Gets the Partner Center application identifier.
/// </summary>
@ -74,11 +74,6 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
/// </summary>
SecureString PartnerCenterApplicationSecret { get; }
/// <summary>
/// Gets the Partner Center application tenant identifier.
/// </summary>
string PartnerCenterApplicationTenantId { get; }
/// <summary>
/// Gets the Partner Center endpoint address.
/// </summary>

Просмотреть файл

@ -51,7 +51,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
/// <returns>A <see cref="Task"/> that represents the asynchronous operation.</returns>
public async Task ClearAsync(CacheDatabaseType database)
{
await Task.FromResult(0);
await Task.FromResult(0).ConfigureAwait(false);
}
/// <summary>
@ -65,8 +65,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
/// </exception>
public async Task DeleteAsync(CacheDatabaseType database, string key = null)
{
IDatabase cache = await GetCacheReferenceAsync(database);
await cache.KeyDeleteAsync(key);
IDatabase cache = await GetCacheReferenceAsync(database).ConfigureAwait(false);
await cache.KeyDeleteAsync(key).ConfigureAwait(false);
}
/// <summary>
@ -107,8 +107,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
{
key.AssertNotEmpty(nameof(key));
IDatabase cache = await GetCacheReferenceAsync(database);
RedisValue value = await cache.StringGetAsync(key);
IDatabase cache = await GetCacheReferenceAsync(database).ConfigureAwait(false);
RedisValue value = await cache.StringGetAsync(key).ConfigureAwait(false);
return value.HasValue ? DecompressEntity<TEntity>(value) : null;
}
@ -134,10 +134,10 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
key.AssertNotEmpty(nameof(key));
entity.AssertNotNull(nameof(entity));
IDatabase cache = await GetCacheReferenceAsync(database);
IDatabase cache = await GetCacheReferenceAsync(database).ConfigureAwait(false);
await cache.StringSetAsync(
key, CompressEntity(entity), expiration);
key, CompressEntity(entity), expiration).ConfigureAwait(false);
}
/// <summary>
@ -287,34 +287,10 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Providers
if (connection == null)
{
connection = await ConnectionMultiplexer.ConnectAsync(
provider.Configuration.RedisCacheConnectionString.ToUnsecureString());
provider.Configuration.RedisCacheConnectionString.ToUnsecureString()).ConfigureAwait(false);
}
return connection.GetDatabase((int)database);
}
/// <summary>
/// Executes an asynchronous method synchronously
/// </summary>
/// <typeparam name="T">The type to be returned.</typeparam>
/// <param name="operation">The asynchronous operation to be executed.</param>
/// <returns>The result from the operation.</returns>
private static T SynchronousExecute<T>(Func<Task<T>> operation)
{
try
{
return Task.Run(async () => await operation?.Invoke()).Result;
}
catch (AggregateException ex)
{
if (ex.InnerException != null)
{
throw ex.InnerException;
}
throw;
}
}
}
}

Просмотреть файл

@ -1,21 +1,17 @@
/* NUGET: BEGIN LICENSE TEXT
*
* Microsoft grants you the right to use these script files for the sole
* purpose of either: (i) interacting through your browser with the Microsoft
* website or online service, subject to the applicable licensing or use
* terms; or (ii) using the files as included with a Microsoft product subject
* to that product's license terms. Microsoft reserves all other rights to the
* files not expressly granted by Microsoft, whether by implication, estoppel
* or otherwise. Insofar as a script file is dual licensed under GPL,
* Microsoft neither took the code under GPL nor distributes it thereunder but
* under the terms set out in this paragraph. All notices and licenses
* below are for informational purposes only.
*
* NUGET: END LICENSE TEXT */
/*!
** Unobtrusive Ajax support library for jQuery
** Copyright (C) Microsoft Corporation. All rights reserved.
*/
// Unobtrusive Ajax support library for jQuery
// Copyright (C) Microsoft Corporation. All rights reserved.
// @version v3.2.5
//
// Microsoft grants you the right to use these script files for the sole
// purpose of either: (i) interacting through your browser with the Microsoft
// website or online service, subject to the applicable licensing or use
// terms; or (ii) using the files as included with a Microsoft product subject
// to that product's license terms. Microsoft reserves all other rights to the
// files not expressly granted by Microsoft, whether by implication, estoppel
// or otherwise. Insofar as a script file is dual licensed under GPL,
// Microsoft neither took the code under GPL nor distributes it thereunder but
// under the terms set out in this paragraph. All notices and licenses
// below are for informational purposes only.
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global window: false, jQuery: false */
@ -56,19 +52,21 @@
mode = (element.getAttribute("data-ajax-mode") || "").toUpperCase();
$(element.getAttribute("data-ajax-update")).each(function (i, update) {
var top;
switch (mode) {
case "BEFORE":
$(update).prepend(data);
break;
case "AFTER":
$(update).append(data);
break;
case "REPLACE-WITH":
$(update).replaceWith(data);
break;
default:
$(update).html(data);
break;
case "BEFORE":
$(update).prepend(data);
break;
case "AFTER":
$(update).append(data);
break;
case "REPLACE-WITH":
$(update).replaceWith(data);
break;
default:
$(update).html(data);
break;
}
});
}
@ -87,7 +85,7 @@
$.extend(options, {
type: element.getAttribute("data-ajax-method") || undefined,
url: element.getAttribute("data-ajax-url") || undefined,
cache: !!element.getAttribute("data-ajax-cache"),
cache: (element.getAttribute("data-ajax-cache") || "").toLowerCase() === "true",
beforeSend: function (xhr) {
var result;
asyncOnBeforeSend(xhr, method);
@ -168,7 +166,7 @@
$(document).on("submit", "form[data-ajax=true]", function (evt) {
var clickInfo = $(this).data(data_click) || [],
clickTarget = $(this).data(data_target),
isCancel = clickTarget && clickTarget.hasClass("cancel");
isCancel = clickTarget && (clickTarget.hasClass("cancel") || clickTarget.attr('formnovalidate') !== undefined);
evt.preventDefault();
if (!isCancel && !validate(this)) {
return;
@ -179,4 +177,4 @@
data: clickInfo.concat($(this).serializeArray())
});
});
}(jQuery));
}(jQuery));

Просмотреть файл

@ -1,33 +1,15 @@
/* NUGET: BEGIN LICENSE TEXT
*
* Microsoft grants you the right to use these script files for the sole
* purpose of either: (i) interacting through your browser with the Microsoft
* website or online service, subject to the applicable licensing or use
* terms; or (ii) using the files as included with a Microsoft product subject
* to that product's license terms. Microsoft reserves all other rights to the
* files not expressly granted by Microsoft, whether by implication, estoppel
* or otherwise. Insofar as a script file is dual licensed under GPL,
* Microsoft neither took the code under GPL nor distributes it thereunder but
* under the terms set out in this paragraph. All notices and licenses
* below are for informational purposes only.
*
* NUGET: END LICENSE TEXT */
/* NUGET: BEGIN LICENSE TEXT
*
* Microsoft grants you the right to use these script files for the sole
* purpose of either: (i) interacting through your browser with the Microsoft
* website or online service, subject to the applicable licensing or use
* terms; or (ii) using the files as included with a Microsoft product subject
* to that product's license terms. Microsoft reserves all other rights to the
* files not expressly granted by Microsoft, whether by implication, estoppel
* or otherwise. Insofar as a script file is dual licensed under GPL,
* Microsoft neither took the code under GPL nor distributes it thereunder but
* under the terms set out in this paragraph. All notices and licenses
* below are for informational purposes only.
*
* NUGET: END LICENSE TEXT */
/*
** Unobtrusive Ajax support library for jQuery
** Copyright (C) Microsoft Corporation. All rights reserved.
*/
(function(a){var b="unobtrusiveAjaxClick",d="unobtrusiveAjaxClickTarget",h="unobtrusiveValidation";function c(d,b){var a=window,c=(d||"").split(".");while(a&&c.length)a=a[c.shift()];if(typeof a==="function")return a;b.push(d);return Function.constructor.apply(null,b)}function e(a){return a==="GET"||a==="POST"}function g(b,a){!e(a)&&b.setRequestHeader("X-HTTP-Method-Override",a)}function i(c,b,e){var d;if(e.indexOf("application/x-javascript")!==-1)return;d=(c.getAttribute("data-ajax-mode")||"").toUpperCase();a(c.getAttribute("data-ajax-update")).each(function(e,c){switch(d){case"BEFORE":a(c).prepend(b);break;case"AFTER":a(c).append(b);break;case"REPLACE-WITH":a(c).replaceWith(b);break;default:a(c).html(b)}})}function f(b,d){var j,k,f,h;j=b.getAttribute("data-ajax-confirm");if(j&&!window.confirm(j))return;k=a(b.getAttribute("data-ajax-loading"));h=parseInt(b.getAttribute("data-ajax-loading-duration"),10)||0;a.extend(d,{type:b.getAttribute("data-ajax-method")||undefined,url:b.getAttribute("data-ajax-url")||undefined,cache:!!b.getAttribute("data-ajax-cache"),beforeSend:function(d){var a;g(d,f);a=c(b.getAttribute("data-ajax-begin"),["xhr"]).apply(b,arguments);a!==false&&k.show(h);return a},complete:function(){k.hide(h);c(b.getAttribute("data-ajax-complete"),["xhr","status"]).apply(b,arguments)},success:function(a,e,d){i(b,a,d.getResponseHeader("Content-Type")||"text/html");c(b.getAttribute("data-ajax-success"),["data","status","xhr"]).apply(b,arguments)},error:function(){c(b.getAttribute("data-ajax-failure"),["xhr","status","error"]).apply(b,arguments)}});d.data.push({name:"X-Requested-With",value:"XMLHttpRequest"});f=d.type.toUpperCase();if(!e(f)){d.type="POST";d.data.push({name:"X-HTTP-Method-Override",value:f})}a.ajax(d)}function j(c){var b=a(c).data(h);return!b||!b.validate||b.validate()}a(document).on("click","a[data-ajax=true]",function(a){a.preventDefault();f(this,{url:this.href,type:"GET",data:[]})});a(document).on("click","form[data-ajax=true] input[type=image]",function(c){var g=c.target.name,e=a(c.target),f=a(e.parents("form")[0]),d=e.offset();f.data(b,[{name:g+".x",value:Math.round(c.pageX-d.left)},{name:g+".y",value:Math.round(c.pageY-d.top)}]);setTimeout(function(){f.removeData(b)},0)});a(document).on("click","form[data-ajax=true] :submit",function(e){var g=e.currentTarget.name,f=a(e.target),c=a(f.parents("form")[0]);c.data(b,g?[{name:g,value:e.currentTarget.value}]:[]);c.data(d,f);setTimeout(function(){c.removeData(b);c.removeData(d)},0)});a(document).on("submit","form[data-ajax=true]",function(h){var e=a(this).data(b)||[],c=a(this).data(d),g=c&&c.hasClass("cancel");h.preventDefault();if(!g&&!j(this))return;f(this,{url:this.action,type:this.method||"GET",data:e.concat(a(this).serializeArray())})})})(jQuery);
// Unobtrusive Ajax support library for jQuery
// Copyright (C) Microsoft Corporation. All rights reserved.
// @version v3.2.5
//
// Microsoft grants you the right to use these script files for the sole
// purpose of either: (i) interacting through your browser with the Microsoft
// website or online service, subject to the applicable licensing or use
// terms; or (ii) using the files as included with a Microsoft product subject
// to that product's license terms. Microsoft reserves all other rights to the
// files not expressly granted by Microsoft, whether by implication, estoppel
// or otherwise. Insofar as a script file is dual licensed under GPL,
// Microsoft neither took the code under GPL nor distributes it thereunder but
// under the terms set out in this paragraph. All notices and licenses
// below are for informational purposes only.
!function(t){function a(t,a){for(var e=window,r=(t||"").split(".");e&&r.length;)e=e[r.shift()];return"function"==typeof e?e:(a.push(t),Function.constructor.apply(null,a))}function e(t){return"GET"===t||"POST"===t}function r(t,a){e(a)||t.setRequestHeader("X-HTTP-Method-Override",a)}function n(a,e,r){var n;r.indexOf("application/x-javascript")===-1&&(n=(a.getAttribute("data-ajax-mode")||"").toUpperCase(),t(a.getAttribute("data-ajax-update")).each(function(a,r){switch(n){case"BEFORE":t(r).prepend(e);break;case"AFTER":t(r).append(e);break;case"REPLACE-WITH":t(r).replaceWith(e);break;default:t(r).html(e)}}))}function u(u,i){var o,d,c,s;o=u.getAttribute("data-ajax-confirm"),o&&!window.confirm(o)||(d=t(u.getAttribute("data-ajax-loading")),s=parseInt(u.getAttribute("data-ajax-loading-duration"),10)||0,t.extend(i,{type:u.getAttribute("data-ajax-method")||void 0,url:u.getAttribute("data-ajax-url")||void 0,cache:"true"===(u.getAttribute("data-ajax-cache")||"").toLowerCase(),beforeSend:function(t){var e;return r(t,c),e=a(u.getAttribute("data-ajax-begin"),["xhr"]).apply(u,arguments),e!==!1&&d.show(s),e},complete:function(){d.hide(s),a(u.getAttribute("data-ajax-complete"),["xhr","status"]).apply(u,arguments)},success:function(t,e,r){n(u,t,r.getResponseHeader("Content-Type")||"text/html"),a(u.getAttribute("data-ajax-success"),["data","status","xhr"]).apply(u,arguments)},error:function(){a(u.getAttribute("data-ajax-failure"),["xhr","status","error"]).apply(u,arguments)}}),i.data.push({name:"X-Requested-With",value:"XMLHttpRequest"}),c=i.type.toUpperCase(),e(c)||(i.type="POST",i.data.push({name:"X-HTTP-Method-Override",value:c})),t.ajax(i))}function i(a){var e=t(a).data(c);return!e||!e.validate||e.validate()}var o="unobtrusiveAjaxClick",d="unobtrusiveAjaxClickTarget",c="unobtrusiveValidation";t(document).on("click","a[data-ajax=true]",function(t){t.preventDefault(),u(this,{url:this.href,type:"GET",data:[]})}),t(document).on("click","form[data-ajax=true] input[type=image]",function(a){var e=a.target.name,r=t(a.target),n=t(r.parents("form")[0]),u=r.offset();n.data(o,[{name:e+".x",value:Math.round(a.pageX-u.left)},{name:e+".y",value:Math.round(a.pageY-u.top)}]),setTimeout(function(){n.removeData(o)},0)}),t(document).on("click","form[data-ajax=true] :submit",function(a){var e=a.currentTarget.name,r=t(a.target),n=t(r.parents("form")[0]);n.data(o,e?[{name:e,value:a.currentTarget.value}]:[]),n.data(d,r),setTimeout(function(){n.removeData(o),n.removeData(d)},0)}),t(document).on("submit","form[data-ajax=true]",function(a){var e=t(this).data(o)||[],r=t(this).data(d),n=r&&(r.hasClass("cancel")||void 0!==r.attr("formnovalidate"));a.preventDefault(),(n||i(this))&&u(this,{url:this.action,type:this.method||"GET",data:e.concat(t(this).serializeArray())})})}(jQuery);

Просмотреть файл

@ -1,26 +1,22 @@
/* NUGET: BEGIN LICENSE TEXT
*
* Microsoft grants you the right to use these script files for the sole
* purpose of either: (i) interacting through your browser with the Microsoft
* website or online service, subject to the applicable licensing or use
* terms; or (ii) using the files as included with a Microsoft product subject
* to that product's license terms. Microsoft reserves all other rights to the
* files not expressly granted by Microsoft, whether by implication, estoppel
* or otherwise. Insofar as a script file is dual licensed under GPL,
* Microsoft neither took the code under GPL nor distributes it thereunder but
* under the terms set out in this paragraph. All notices and licenses
* below are for informational purposes only.
*
* NUGET: END LICENSE TEXT */
/*!
** Unobtrusive validation support library for jQuery and jQuery Validate
** Copyright (C) Microsoft Corporation. All rights reserved.
*/
// Unobtrusive validation support library for jQuery and jQuery Validate
// Copyright (C) Microsoft Corporation. All rights reserved.
// @version v3.2.10
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
(function ($) {
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS-like environments that support module.exports
module.exports = factory(require('jquery-validation'));
} else {
// Browser global
jQuery.validator.unobtrusive = factory(jQuery);
}
}(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
@ -84,11 +80,12 @@
}
function onSuccess(error) { // 'this' is the form element
var container = error.data("unobtrusiveContainer"),
replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
var container = error.data("unobtrusiveContainer");
if (container) {
var replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
container.addClass("field-validation-valid").removeClass("field-validation-error");
error.removeData("unobtrusiveContainer");
@ -131,7 +128,7 @@
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
}
};
if (!result) {
result = {
@ -422,8 +419,13 @@
setValidationValues(options, "regex", options.params.regex);
}
});
adapters.add("fileextensions", ["extensions"], function (options) {
setValidationValues(options, "extension", options.params.extensions);
});
$(function () {
$jQval.unobtrusive.parse(document);
});
}(jQuery));
return $jQval.unobtrusive;
}));

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -1,11 +1,13 @@
// -----------------------------------------------------------------------
// <copyright file="AuthenticationFilter.cs" company="Microsoft">
// <copyright file="AuthenticationFilterAttribute.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
// -----------------------------------------------------------------------
namespace Microsoft.Store.PartnerCenter.Explorer.Security
{
using System;
using System.Security.Claims;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Filters;
@ -13,7 +15,8 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Security
/// <summary>
/// Augments MVC authentication by replacing the principal with a more usable customer portal principal object.
/// </summary>
public class AuthenticationFilter : ActionFilterAttribute, IAuthenticationFilter
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class AuthenticationFilterAttribute : ActionFilterAttribute, IAuthenticationFilter
{
/// <summary>
/// Injects a more friendly claims principal of type <see cref="CustomerPrincipal"/>.
@ -21,7 +24,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Security
/// <param name="filterContext">The context to use for authentication.</param>
public void OnAuthentication(AuthenticationContext filterContext)
{
filterContext.Principal = new CustomerPrincipal(HttpContext.Current.User as System.Security.Claims.ClaimsPrincipal);
filterContext.Principal = new CustomerPrincipal(HttpContext.Current.User as ClaimsPrincipal);
}
/// <summary>

Просмотреть файл

@ -17,12 +17,12 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Security
/// Authorization filter attribute used to verify authenticated user has the specified claim and value.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizationFilterAttribute : AuthorizeAttribute
public sealed class AuthorizationFilterAttribute : AuthorizeAttribute
{
/// <summary>
/// Gets or sets the required roles.
/// </summary>
public new UserRole Roles { get; set; }
public new UserRoles Roles { get; set; }
/// <summary>
/// Verifies the authenticated user has the appropriate privileges.
@ -37,7 +37,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Security
{
principal = httpContext.User as CustomerPrincipal;
foreach (string role in this.GetRoles(this.Roles))
foreach (string role in GetRoles(Roles))
{
if (principal.HasClaim(System.Security.Claims.ClaimTypes.Role, role))
{
@ -65,9 +65,9 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Security
new RouteValueDictionary(
new
{
controller = "Error",
action = "ShowError",
errorMessage = "You do not have sufficient priviliges to view this page."
controller = "Home",
action = "Error",
message = "You do not have sufficient priviliges to view this page."
}));
}
else
@ -81,38 +81,38 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Security
/// </summary>
/// <param name="requiredRole">User role required to perform the operation.</param>
/// <returns>A list of roles that required to perform the operation.</returns>
private List<string> GetRoles(UserRole requiredRole)
private static List<string> GetRoles(UserRoles requiredRole)
{
List<string> required = new List<string>();
if (requiredRole.HasFlag(UserRole.AdminAgents))
if (requiredRole.HasFlag(UserRoles.AdminAgents))
{
required.Add(UserRole.AdminAgents.GetDescription());
required.Add(UserRoles.AdminAgents.GetDescription());
}
if (requiredRole.HasFlag(UserRole.BillingAdmin))
if (requiredRole.HasFlag(UserRoles.BillingAdmin))
{
required.Add(UserRole.BillingAdmin.GetDescription());
required.Add(UserRoles.BillingAdmin.GetDescription());
}
if (requiredRole.HasFlag(UserRole.GlobalAdmin))
if (requiredRole.HasFlag(UserRoles.GlobalAdmin))
{
required.Add(UserRole.GlobalAdmin.GetDescription());
required.Add(UserRoles.GlobalAdmin.GetDescription());
}
if (requiredRole.HasFlag(UserRole.HelpdeskAgent))
if (requiredRole.HasFlag(UserRoles.HelpdeskAgent))
{
required.Add(UserRole.HelpdeskAgent.GetDescription());
required.Add(UserRoles.HelpdeskAgent.GetDescription());
}
if (requiredRole.HasFlag(UserRole.User))
if (requiredRole.HasFlag(UserRoles.User))
{
required.Add(UserRole.User.GetDescription());
required.Add(UserRoles.User.GetDescription());
}
if (requiredRole.HasFlag(UserRole.UserAdministrator))
if (requiredRole.HasFlag(UserRoles.UserAdministrator))
{
required.Add(UserRole.UserAdministrator.GetDescription());
required.Add(UserRoles.UserAdministrator.GetDescription());
}
return required;

Просмотреть файл

@ -13,7 +13,7 @@ namespace Microsoft.Store.PartnerCenter.Explorer.Security
/// Defines the various user roles.
/// </summary>
[Flags]
public enum UserRole
public enum UserRoles
{
/// <summary>
/// Partner Center role that provides complete access to Partner Center.

Просмотреть файл

@ -74,33 +74,19 @@
<mimeMap fileExtension="woff2" mimeType="application/font-woff" />
</staticContent>
</system.webServer>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
</compilers>
</system.codedom>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.1.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.19.2.6005" newVersion="3.19.2.6005" />
<bindingRedirect oldVersion="0.0.0.0-3.19.8.16603" newVersion="3.19.8.16603" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory.Platform" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.19.2.6005" newVersion="3.19.2.6005" />
<bindingRedirect oldVersion="0.0.0.0-3.19.8.16603" newVersion="3.19.8.16603" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
@ -112,11 +98,11 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.1" newVersion="4.0.2.1" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.ApplicationInsights" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.5.1.0" newVersion="2.5.1.0" />
<bindingRedirect oldVersion="0.0.0.0-2.6.4.0" newVersion="2.6.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
@ -124,7 +110,7 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.2.1.0" />
<bindingRedirect oldVersion="0.0.0.0-5.2.4.0" newVersion="5.2.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Protocol.Extensions" publicKeyToken="31bf3856ad364e35" culture="neutral" />
@ -148,20 +134,38 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Protocols.OpenIdConnect" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.2.1.0" />
<bindingRedirect oldVersion="0.0.0.0-5.2.4.0" newVersion="5.2.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Tokens" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.2.1.0" />
<bindingRedirect oldVersion="0.0.0.0-5.2.4.0" newVersion="5.2.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Protocols" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.2.1.0" />
<bindingRedirect oldVersion="0.0.0.0-5.2.4.0" newVersion="5.2.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-5.2.4.0" newVersion="5.2.4.0" />
<bindingRedirect oldVersion="0.0.0.0-5.2.6.0" newVersion="5.2.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.AspNet.TelemetryCorrelation" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.0.3.0" newVersion="1.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
</compilers>
</system.codedom>
</configuration>

Просмотреть файл

@ -2,48 +2,53 @@
<packages>
<package id="Antlr" version="3.5.0.2" targetFramework="net461" />
<package id="bootstrap" version="3.3.7" targetFramework="net461" />
<package id="CsvHelper" version="7.1.0" targetFramework="net461" />
<package id="CsvHelper" version="7.1.1" targetFramework="net461" />
<package id="FontAwesome" version="4.7.0" targetFramework="net461" />
<package id="jQuery" version="3.3.1" targetFramework="net461" />
<package id="jQuery.UI.Combined" version="1.12.1" targetFramework="net461" />
<package id="jQuery.Validation" version="1.17.0" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights" version="2.5.1" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights" version="2.6.4" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.Agent.Intercept" version="2.4.0" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.DependencyCollector" version="2.5.1" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.DependencyCollector" version="2.6.4" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.JavaScript" version="0.22.9-build00167" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.PerfCounterCollector" version="2.5.1" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.SnapshotCollector" version="1.2.0" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.Web" version="2.5.1" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.WindowsServer" version="2.5.1" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" version="2.5.1" targetFramework="net461" />
<package id="Microsoft.AspNet.Mvc" version="5.2.4" targetFramework="net461" />
<package id="Microsoft.AspNet.Razor" version="3.2.4" targetFramework="net461" />
<package id="Microsoft.AspNet.TelemetryCorrelation" version="1.0.0" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.PerfCounterCollector" version="2.6.4" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.SnapshotCollector" version="1.3.0" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.Web" version="2.6.4" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.WindowsServer" version="2.6.4" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" version="2.6.4" targetFramework="net461" />
<package id="Microsoft.AspNet.Mvc" version="5.2.6" targetFramework="net461" />
<package id="Microsoft.AspNet.Razor" version="3.2.6" targetFramework="net461" />
<package id="Microsoft.AspNet.TelemetryCorrelation" version="1.0.3" targetFramework="net461" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebPages" version="3.2.4" targetFramework="net461" />
<package id="Microsoft.Azure.KeyVault" version="2.3.2" targetFramework="net461" />
<package id="Microsoft.Azure.KeyVault.WebKey" version="2.0.7" targetFramework="net461" />
<package id="Microsoft.AspNet.WebPages" version="3.2.6" targetFramework="net461" />
<package id="Microsoft.Azure.KeyVault" version="3.0.0" targetFramework="net461" />
<package id="Microsoft.Azure.KeyVault.WebKey" version="3.0.0" targetFramework="net461" />
<package id="Microsoft.Azure.Management.ResourceManager" version="1.6.0-preview" targetFramework="net461" />
<package id="Microsoft.Azure.Services.AppAuthentication" version="1.1.0-preview" targetFramework="net461" />
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net461" />
<package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net461" />
<package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net461" />
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.8" targetFramework="net461" />
<package id="Microsoft.CodeAnalysis.FxCopAnalyzers" version="2.6.1" targetFramework="net461" developmentDependency="true" />
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="2.0.0" targetFramework="net461" />
<package id="Microsoft.CodeQuality.Analyzers" version="2.6.1" targetFramework="net461" developmentDependency="true" />
<package id="Microsoft.Data.Edm" version="5.8.3" targetFramework="net461" />
<package id="Microsoft.Data.OData" version="5.8.3" targetFramework="net461" />
<package id="Microsoft.Data.Services.Client" version="5.8.3" targetFramework="net461" />
<package id="Microsoft.Graph" version="1.8.0" targetFramework="net461" />
<package id="Microsoft.Graph.Core" version="1.8.1" targetFramework="net461" />
<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.19.2" targetFramework="net461" />
<package id="Microsoft.IdentityModel.Logging" version="5.2.1" targetFramework="net461" />
<package id="Microsoft.Graph" version="1.9.0" targetFramework="net461" />
<package id="Microsoft.Graph.Core" version="1.9.0" targetFramework="net461" />
<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.19.8" targetFramework="net461" />
<package id="Microsoft.IdentityModel.JsonWebTokens" version="5.2.4" targetFramework="net461" />
<package id="Microsoft.IdentityModel.Logging" version="5.2.4" targetFramework="net461" />
<package id="Microsoft.IdentityModel.Protocol.Extensions" version="1.0.4.403061554" targetFramework="net461" />
<package id="Microsoft.IdentityModel.Protocols" version="5.2.1" targetFramework="net461" />
<package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="5.2.1" targetFramework="net461" />
<package id="Microsoft.IdentityModel.Tokens" version="5.2.1" targetFramework="net461" />
<package id="Microsoft.jQuery.Unobtrusive.Ajax" version="3.2.4" targetFramework="net461" />
<package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.4" targetFramework="net461" />
<package id="Microsoft.Net.Compilers" version="2.7.0" targetFramework="net461" developmentDependency="true" />
<package id="Microsoft.IdentityModel.Protocols" version="5.2.4" targetFramework="net461" />
<package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="5.2.4" targetFramework="net461" />
<package id="Microsoft.IdentityModel.Tokens" version="5.2.4" targetFramework="net461" />
<package id="Microsoft.jQuery.Unobtrusive.Ajax" version="3.2.5" targetFramework="net461" />
<package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.10" targetFramework="net461" />
<package id="Microsoft.Net.Compilers" version="2.8.2" targetFramework="net461" developmentDependency="true" />
<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net461" />
<package id="Microsoft.NetCore.Analyzers" version="2.6.1" targetFramework="net461" developmentDependency="true" />
<package id="Microsoft.NetFramework.Analyzers" version="2.6.1" targetFramework="net461" developmentDependency="true" />
<package id="Microsoft.Owin" version="4.0.0" targetFramework="net461" />
<package id="Microsoft.Owin.Host.SystemWeb" version="4.0.0" targetFramework="net461" />
<package id="Microsoft.Owin.Security" version="4.0.0" targetFramework="net461" />
@ -51,16 +56,16 @@
<package id="Microsoft.Owin.Security.OpenIdConnect" version="4.0.0" targetFramework="net461" />
<package id="Microsoft.Rest.ClientRuntime" version="2.3.11" targetFramework="net461" />
<package id="Microsoft.Rest.ClientRuntime.Azure" version="3.3.12" targetFramework="net461" />
<package id="Microsoft.Store.PartnerCenter" version="1.7.1" targetFramework="net461" />
<package id="Microsoft.Store.PartnerCenter" version="1.8.0" targetFramework="net461" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net461" />
<package id="Newtonsoft.Json" version="11.0.1" targetFramework="net461" />
<package id="Newtonsoft.Json" version="11.0.2" targetFramework="net461" />
<package id="Owin" version="1.0" targetFramework="net461" />
<package id="Respond" version="1.4.2" targetFramework="net461" />
<package id="StackExchange.Redis.StrongName" version="1.2.6" targetFramework="net461" />
<package id="System.ComponentModel.EventBasedAsync" version="4.3.0" targetFramework="net461" />
<package id="System.Diagnostics.DiagnosticSource" version="4.4.1" targetFramework="net461" />
<package id="System.Diagnostics.DiagnosticSource" version="4.5.0" targetFramework="net461" />
<package id="System.Dynamic.Runtime" version="4.3.0" targetFramework="net461" />
<package id="System.IdentityModel.Tokens.Jwt" version="5.2.1" targetFramework="net461" />
<package id="System.IdentityModel.Tokens.Jwt" version="5.2.4" targetFramework="net461" />
<package id="System.IO.Compression" version="4.3.0" targetFramework="net461" />
<package id="System.Linq.Queryable" version="4.3.0" targetFramework="net461" />
<package id="System.Net.Http" version="4.3.3" targetFramework="net461" />
@ -71,9 +76,10 @@
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="net461" />
<package id="System.Spatial" version="5.8.3" targetFramework="net461" />
<package id="Unity" version="5.7.3" targetFramework="net461" />
<package id="Text.Analyzers" version="2.6.1" targetFramework="net461" developmentDependency="true" />
<package id="Unity" version="5.8.6" targetFramework="net461" />
<package id="Unity.Abstractions" version="3.3.0" targetFramework="net461" />
<package id="Unity.Container" version="5.7.3" targetFramework="net461" />
<package id="Unity.Container" version="5.8.6" targetFramework="net461" />
<package id="Unity.Mvc" version="5.0.13" targetFramework="net461" />
<package id="WebActivatorEx" version="2.2.0" targetFramework="net461" />
<package id="WebGrease" version="1.6.0" targetFramework="net461" />