Git Product home page Git Product logo

commercial-marketplace-saas-accelerator's Introduction


The SaaS Accelerator is offered under the MIT License as open source software and is not supported by Microsoft. If you need help with the accelerator or would like to report defects or feature requests, use the Issues feature on this GitHub repository.


Microsoft Commercial Marketplace - Community Code for SaaS Applications


๐Ÿ“ Please leave us your ideas and feedback on the SaaS Accelerator in this brief, anonymous survey.


Introduction

The SaaS Accelerator is a production-ready solution designed to make it easier for Microsoft partners to sell their SaaS solutions via Microsoft Commercial Marketplace. Microsoft partners can use SaaS Accelerator to simplify the process of bringing their SaaS solutions to the Marketplace. It is a ready-to-use, community-supported solution providing the following capabilities:

๐Ÿš€ Quick & Easy Deployment: Go live in under 15 minutes with our low-code, production-ready solution.

๐Ÿ”ง Turnkey Solution: Meets all technical prerequisites for your SaaS offers.

๐Ÿ’ผ Subscriptions Simplified: A streamlined interface to optimize your subscription workflow.

๐Ÿ’ฒ Flexible Billing: Advanced capabilities for custom billing and pricing models.

๐Ÿ› ๏ธ Stay in Control: A dedicated adminstrative portal for managing all your customer subscriptions.

Transform your SaaS game. Leverage SaaS Accelerator now!

Description

The project is implemented in .NET and uses the commercial marketplace billing system, including the SaaS Fulfillment API (v2) and Marketplace Metering Service API. The SaaS Accelerator models how a typical SaaS platform interacts with the marketplace APIs to provision subscriptions for customers, enable logging, and manage commercial marketplace subscriptions. The SaaS Accelerator may be installed as-is or may be customized to support your requirements.

Stay current with the latest updates!

The SaaS Accelerator project team releases regularly releases new versions. Please see the release notes page for updates. We recommend keeping up to date with latest releases to stay current on security patches, bug fixes, and new features.

To update your SaaS Accelerator installation, use the Update script documented here.

Intended Use

This code is a reference implementation of required components of a commercial marketplace SaaS offer and complements the existing commercial marketplace documentation.

This project accelerates the SaaS offer onboarding experience for those building SaaS solutions for the Microsoft commercial marketplace. Whether installed and used as-is or customized for your particular requirements, this reference implementation provides all main components required by a commercial marketplace SaaS offer.

NOTE: Support for this project is community-based and contributions are welcome. Details on contributing can be found below.. This is not an officially supported Microsoft product.

Installation

Installation instructions are here, as well as documents detailing architecture and scaled installation considerations are also available. Following these instructions will typically have the SaaS Accelerator installed in 20 minutes or less.

Advanced Installation instructions are here. These are detailed instructions to address different deployment scenarios such as how-to run it locally or deploy it from Visual Studio.

Video instructions Additionally, there is a quick video on the installation process. Installing the SaaS Accelerator with the Azure portal cloud shell available through Mastering the Marketplace.

Upgrade to newer version Follow these instructions to move your release to the current version.

Additional technical documents

  1. Enterprise reference architectures
  2. Single region architectures
  3. Multi-region architectures
  4. Advanced installation checklist

Monitoring

The following documents provide how-tos for setting up Azure Monitoring and Alerting for the resources deployed by the SaaS Accelerator:

Commercial Marketplace Documentation

Before using this project, please review the commercial marketplace documentation resources below to understand the important concepts, account setup, and offer configuration requirements for publishing SaaS SaaS application offers.

SaaS Accelerator Overview

Saas Diagram

Projects

The source /src directory contains the following Visual Studio projects.

Project Description Directory Name
Customer portal - Sample web application Demonstrates how to register, provision, and activate the marketplace subscription. Implemented using ASP.Net Core 8.0, the sample web application uses the Services client library and data access library to invoke and persist API interactions and provides an example user interface to demonstrate how a customer would manage their subscriptions and plans. CustomerSite
Publisher portal - Sample web application Demonstrates how to generate usage events used in metered billing transactions, and how to emit these events to the Marketplace Metering Service API. AdminSite
Client data access library Demonstrates how to persist plans, marketplace subscriptions, and related transaction attributes when using the SaaS Fulfillment API (v2) and Marketplace Metering Service API. DataAccess
Services client library Contains the services used by the Customer and Publisher portals, including the POCO classes to orchestrate calls to the marketplace APIs on client library / database. Services
Unit tests project Helps validate and test the codebase. ServicesTest

The sample code in this repository runs in the publisher's environment as illustrated below. The metering SDK (.NET class library) and a sample web application to report usage events for subscriptions against those plans that support metering (have the dimensions defined and enabled) and correlate to SaaS Metering and SaaS Service blocks in the below image, respectively.

Use case

Technology and Versions

This project has been developed using the following technologies and versions:

Security

The accelerator code has been scanned for vulnerabilities and use secure configurations. Versions have been reviewed to ensure compatibility with the latest security guidelines. To enhance the best practices please see Security best practices.

Prerequisites

Ensure the following prerequisites are met before getting started:

  • You must have an active Azure subscription for development and testing purposes. Create an Azure subscription here.
  • You must have a Partner Center account enabled for use with the commercial marketplace. Create an account here.
  • We recommend using an Integrated Development Environment (IDE): Visual Studio Code, Visual Studio 2019 / 2022, etc...
  • The SaaS Accelerator has been implemented using .NET 8
  • For data persistence we are using Azure SQL Database and Entity Framework. However, feel free to use any data repository you are comfortable with.

Contributing

This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.

When you submit a pull request, a CLA bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.

Developers

Code contributed should follow the C# specifications and best practices as documented here.

FAQs

There is a list of the Frequent Asked Questions here.

License

This project is released under the MIT License.

commercial-marketplace-saas-accelerator's People

Contributors

akhandpratapsingh88 avatar alexdrenea avatar bkhabazan avatar code4clouds avatar dev-kiranbanda avatar dstarr avatar ercenk avatar jayshaw91 avatar jeernest avatar jz5 avatar k-granados avatar keithcharlie avatar louiseph avatar louisephilardeau avatar microsoft-github-operations[bot] avatar microsoftopensource avatar ms-mgrant avatar msalemcode avatar neelavarshad avatar oli-hivemq avatar olsoro0 avatar pbutlerm avatar prasad-3 avatar santhoshb-msft avatar santhoshbomma9 avatar scottperham avatar scseely avatar sergiisinienok avatar snobu avatar tpberntsen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

commercial-marketplace-saas-accelerator's Issues

Installation Instructions: Create Web Apps on Azure and deploy the code Link Text for Publisher sample web application

Describe the bug
In chapter "Create Web Apps on Azure and deploy the code" of the installation instructrions, the text for the link to source for the "Publisher sample web application" is wrong. It says "src/SaaS.SDK.CustomerProvisioning" but correctly targets the publisher solution.

To Reproduce
Steps to reproduce the behavior:

  1. Go to [https://github.com/Azure/Microsoft-commercial-marketplace-transactable-SaaS-offer-SDK/blob/master/docs/Installation-Instructions.md#create-web-apps-on-azure-and-deploy-the-code]
  2. See error: The text for both links is the same, though the target is different.

Expected behavior
The text should correspond to the target of the link.
image

Desktop (please complete the following information):

  • OS: Windows 10
  • Browser Edge Chrome
  • Version current

Support Metering Batch API on Client

Is your feature request related to a problem? Please describe.
The API Batch implementation is missing.

Describe the solution you'd like
Implement the missing API

Describe alternatives you've considered
Workaround is to send metering data every hour, instead of once a day.

Additional context
Add any other context or screenshots about the feature request here.

Please Fix Warnings in SaaS.SDK.PublisherSolution

Fix Warnings in the SaaS.SDK.PublisherSolution:

Severity Code Description Project File Line Suppression State
Warning MVC1000 Use of IHtmlHelper.RenderPartial may result in application deadlocks. Consider using Tag Helper or IHtmlHelper.RenderPartialAsync. SaaS.SDK.PublisherSolution Microsoft-commercial-marketplace-transactable-SaaS-offer-SDK\src\SaaS.SDK.PublisherSolution\Views\Licenses\Index.cshtml 20 Active

Severity Code Description Project File Line Suppression State
Warning MVC1000 Use of IHtmlHelper.RenderPartial may result in application deadlocks. Consider using Tag Helper or IHtmlHelper.RenderPartialAsync. SaaS.SDK.PublisherSolution C:\Projects\saas-sdk-azure\patrick-repo-fork\Microsoft-commercial-marketplace-transactable-SaaS-offer-SDK\src\SaaS.SDK.PublisherSolution\Views\Licenses\Index.cshtml 23 Active

Severity Code Description Project File Line Suppression State
Warning MVC1000 Use of IHtmlHelper.RenderPartial may result in application deadlocks. Consider using Tag Helper or IHtmlHelper.RenderPartialAsync. SaaS.SDK.PublisherSolution C:\Projects\saas-sdk-azure\patrick-repo-fork\Microsoft-commercial-marketplace-transactable-SaaS-offer-SDK\src\SaaS.SDK.PublisherSolution\Views\Licenses\Index.cshtml 20 Active

Severity Code Description Project File Line Suppression State
Warning MVC1000 Use of IHtmlHelper.RenderPartial may result in application deadlocks. Consider using Tag Helper or IHtmlHelper.RenderPartialAsync. SaaS.SDK.PublisherSolution C:\Projects\saas-sdk-azure\patrick-repo-fork\Microsoft-commercial-marketplace-transactable-SaaS-offer-SDK\src\SaaS.SDK.PublisherSolution\Views\Licenses\Index.cshtml 23 Active

Portal Page: Add user Management for per Seat Users

Is your feature request related to a problem? Please describe.
Add a Portal section to manage the user licenses (M365 and Teams)

Describe the solution you'd like
Allow buyers to manage their users consuming their seats

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Allow new code updates without having to delete the db

Is your feature request related to a problem? Please describe.
As an IT administrator.,
I would like to update to the new code of the Accelerator
without having to delete the DB.

Describe the solution you'd like
If the script is re-run as the user if the db should be preserved (or even skipped) during an update

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

EmitBatchUsageEventAsync fails with JsonException

Describe the bug
The following code produces System.Text.Json.JsonException: The input does not contain any JSON tokens.

var bill = new[] {
    new MeteringUsageRequest {
        Dimension = "test-cpu",
        EffectiveStartTime = new DateTime(target.Hour, DateTimeKind.Utc),
        Quantity = count,
        PlanId = subscription.AmpplanId,
        ResourceId = target.SubscriptionID,
    },
    new MeteringUsageRequest {
        Dimension = "test-gpu",
        EffectiveStartTime = new DateTime(target.Hour, DateTimeKind.Utc),
        Quantity = count/2.0,
        PlanId = subscription.AmpplanId,
        ResourceId = target.SubscriptionID,
    },
};

var response = await this.billingClient.EmitBatchUsageEventAsync(bill);

Stack Trace

System.Text.Json.JsonException: The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. Path: $ | LineNumber: 0 | BytePositionInLine: 0.
 ---> System.Text.Json.JsonReaderException: The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. LineNumber: 0 | BytePositionInLine: 0.
   at System.Text.Json.ThrowHelper.ThrowJsonReaderException(Utf8JsonReader& json, ExceptionResource resource, Byte nextByte, ReadOnlySpan`1 bytes)
   at System.Text.Json.Utf8JsonReader.Read()
   at System.Text.Json.JsonSerializer.ReadCore(JsonSerializerOptions options, Utf8JsonReader& reader, ReadStack& readStack)
   --- End of inner exception stack trace ---
   at System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStack& readStack, JsonReaderException ex)
   at System.Text.Json.JsonSerializer.ReadCore(JsonSerializerOptions options, Utf8JsonReader& reader, ReadStack& readStack)
   at System.Text.Json.JsonSerializer.ReadCore(Type returnType, JsonSerializerOptions options, Utf8JsonReader& reader)
   at System.Text.Json.JsonSerializer.Deserialize(String json, Type returnType, JsonSerializerOptions options)
   at System.Text.Json.JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options)
   at Microsoft.Marketplace.SaasKit.Network.MeteringApiRestClient`1.ProcessErrorResponse(String url, WebException ex) in D:\a\1\s\src\SaaS.SDK.Client\Network\MeteringApiRestClient.cs:line 52
   at Microsoft.Marketplace.SaasKit.Network.AbstractSaaSApiRestClient`1.DoRequest(String url, String method, Dictionary`2 parameters, Dictionary`2 headers, String contentType) in D:\a\1\s\src\SaaS.SDK.Client\Network\AbstractSaaSApiRestClient.cs:line 78
   at Microsoft.Marketplace.SaasKit.Services.MeteredBillingApiClient.EmitBatchUsageEventAsync(IEnumerable`1 subscriptionBatchUsageRequest) in D:\a\1\s\src\SaaS.SDK.Client\Services\MeteredBillingAPIClient.cs:line 95
   at LostTech.Licensing.MeteringCollector.BillViaMeteringApi.Run(Target target, CloudTable reportsTable, ILogger log) in D:\a\1\s\src\Azure.MeteringCollector\BillViaMeteringApi.cs:line 82

Expected behavior
The exception should explain the reason of the call failure. Instead, SDK fails to parse response.

Environment:
Azure Functions v3

Remarks

ProcessErrorResponse appears to completely ignore exceptions it does not know about, and just silently returns null, which seems to be dangerous.

HomeController.Index() should be async and use await inside

HomeController.Index() is declared like this:

public IActionResult Index(string token = null)

and has code inside that looks like this:

var subscriptionPlanDetail = this.apiClient.GetAllPlansForSubscriptionAsync(newSubscription.SubscriptionId).ConfigureAwait(false).GetAwaiter().GetResult();

It cannot use await because it is not declared async. Other methods in the same class such as ChangeSubscriptionPlan() are declared async and use await no problem:

public async Task<IActionResult> ChangeSubscriptionPlan(SubscriptionResult subscriptionDetail)

Having some methods async and using await and other methods non-async and using GetResult() makes this code unclear and hard to understand.

This should either be explained or changed such that Index() is declared async and uses await.

Create Docker images for the sample components.

**Is your feature request related to a problem?
Facilitate the deployment of the environment using Dockerfiles.

Describe the solution you'd like
I would like all the components to be deployed as docker containers

Describe alternatives you've considered
VMs, but docker images are the best solutions to deploy the sample on Kubernetes environments.

Additional context
Add any other context or screenshots about the feature request here.

Temp Resource Group

Describe the solution you'd like
Allow optional parameter for temp resource group

Additional context
May allow me to stop a collision with an existing resource group.

Admin Page: Add programmable webhook trigger custom actions

Is your feature request related to a problem? Please describe.
Allow the Administrator to program of custom actions for different actions

Describe the solution you'd like
Allow the Administrator to program of custom actions for different actions

Describe alternatives you've considered
In the plans menu allow custom actions that emit webhooks

Additional context
Add any other context or screenshots about the feature request here.

Allow Publishers the ability to replace the CSS for their own.

Is your feature request related to a problem? Please describe.
Provide the publishers the ability to change the CSS using the deployment command line. Or have instruction on how to format it before the command executes.

Describe the solution you'd like
As the deployment execute allow change or edit the CSS file for one they would like to use.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Plan IsPerUser value source of truth

Is your feature request related to a problem? Please describe.
Should the Plan IsPerUser dictated by the subscription details not by manually updating in the database.

Describe the solution you'd like
When the subscription details are loaded for the first time we might set this value

Describe alternatives you've considered
N/A

Additional context
N/A

Add documentation regarding the Logout URL

Is your feature request related to a problem? Please describe.
There is no current SaaS logout url information for the App Registration in the README.

Describe the solution you'd like
Provide customer the expected URL and screenshot for the logout URL.

Ability to upload/replace the logo from the deploy.ps1

Is your feature request related to a problem? Please describe.
Provide the publishers the ability to switch the logo using the deployment command line.

Describe the solution you'd like
As the deployment execute allow publisher to upload the logo of Contoso for the one, they would like to use.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Fetching application packages not working

Describe the bug
Given I have run the command
azcopy copy https://msampbuilddbresources.blob.core.windows.net/msampcontainer/ProvisioningPortal.zip .

Then this command fails because the package is not present.
Publish-AzWebapp -ResourceGroupName saas-demo-rg -Name saasdemo-portal -ArchivePath ProvisioningPortal.zip

Same for next two lines of code.

To Reproduce
Steps to reproduce the behavior:

  1. Work your way through the tutorial of deploying with ARM.
  2. Run these commands

Expected behavior
Install the app code

Desktop (please complete the following information):

  • OS: [e.g. iOS] MacOS
  • Browser [e.g. chrome, safari] Edge
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

UsersRepository.Save() fails to call SaveChanges() for an existing user

UsersRepository.Save() currently goes like this:

        if (existingUser != null)
        {
            existingUser.FullName = userDetail.FullName;
            this.context.Users.Update(existingUser);
            return existingUser.UserId;
        }
        else
        {
            this.context.Users.Add(userDetail);
        }

        this.context.SaveChanges();
        return userDetail.UserId;

SaveChanges is only called after Add() branch is executed. SaveChanges() is not called if control passes through Update() branch.

Meter Enable Automatically based on PlanID

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
I would like the admin page to automatically detect meter plans, so I dont have to enable this manually in the DB

Describe the solution you'd like
A clear and concise description of what you want to happen.
When a new plan is created, I would like the Admin page to read the plans in PC and update the DB content so the Action menu for submitting plans is automatically active.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Instructions conflicting with behavior for IsAutomaticProvisioningSupported

Describe the bug
Instructions are conflicting the behavior, see screen shots below
Instructions say
If the value is True, the options - Change Plan & Unsubscribe are not available to the customer. Clicking Activate button on the landing page would place the subscription in PendingActivation status and doesn't activate the subscription yet. Publisher has the option to activate the subscription, change plan and unsubscribe.

If the value is False, customer can activate, change plan and unsubscribe with any intervention required from the publisher.

But the behavior is opposite

To Reproduce
Steps to reproduce the behavior:

  1. Go to database and update IsAutomaticProvisioningSupported to false
  2. See the customer app only shows ActivityLog
  3. update IsAutomaticProvisioningSupported to True
  4. Customer app provides option to ChangePlan and Unsubscribe

Expected behavior
If the value is False, the options - Change Plan & Unsubscribe are not available to the customer. Clicking Activate button on the landing page would place the subscription in PendingActivation status and doesn't activate the subscription yet. Publisher has the option to activate the subscription, change plan and unsubscribe.

If the value is True, customer can activate, change plan and unsubscribe with any intervention required from the publisher.

Screenshots
image

image

image

image

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context
Add any other context about the problem here.

New subscription stuck in PendingActivation

Describe the bug
I just deployed the ARM template from the demo, and created a preview offer (e.g. it has not yet been published), that is only visible to my own account.

image

The issue is subscription does not get activated.

To Reproduce
When I try to subscribe, and get the "Activate your new subscription" email, "Activate Now" button brings me to lic-portal site, where I accept the terms etc. In the end I get access to the portal where my plan is listed under Subscriptions. However, its status is PendingActivation with no clear reason as to why it is not yet Subscribed.

I've even added (losttech@b60df58) an admin portal view to check out the contents of WebJobSubscriptionStatus, and it appears to be empty.

image

Expected behavior
The status should be Subscribed or ActivationFailed

Desktop (please complete the following information):

  • OS: Windows 10 x64
  • Browser: Chromium-based Edge

Additional context
Add any other context about the problem here.

Update to new C# Client Library

Is your feature request related to a problem? Please describe.
A new feature request. There is a new .NET client Library

Describe the solution you'd like
It uses the new NuGet library, instead of the custom-built library

Describe alternatives you've considered
None, there is an official library and that should be used.

Additional context
Add any other context or screenshots about the feature request here.

Admin page for admin-user managements

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
As a Publisher,
I would like to have a page where I can add new admin user to the Accelerator,
So, I don't have to add them using the DB

Describe the solution you'd like
A clear and concise description of what you want to happen.
A page under a settings menu where a publisher can manage the emails of the new admins.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Provide customer information on how to create the admin user.

Is your feature request related to a problem? Please describe.
There is no documentation on how to create the first admin user.

Describe the solution you'd like
Provide information that the admin email is supposed to be a the friendly user table and provide screenshots.

Describe alternatives you've considered
Alternatively the ARM deployment script creation should prompt for the admin email in the Portal textfield and push it to the deployed DB.

Forbidden: Client is not authorized for this usage resource

Describe the bug
Reporting metered usage in batch fails with

HTTP 403: Forbidden. Client is not authorized for this usage resource.

for each dimension.

This happens on a private plan, that was created and subscribed to recently (the previous plan has been unsubscribed and stopped selling).

Allow Immediate/Delay activation per offer.

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
As a Publisher,
I would like to be able to set an offer as immediate/delay activation,
So I dont have to change this on the database.

Describe the solution you'd like
A clear and concise description of what you want to happen.
On the offers page add a checkbox to enable/disable immediate activation.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Add instruction on the different panels of the admin pages.

**Is your feature request related to a problem? Please describe. **
The subscriptions, plans and offers pages have no instructions on how to use the different features

Describe the solution you'd like
I would like to have a description on this page on how to utilize each panel and the features it provides.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Provide guidance to user on where to find the DB Creds.

Is your feature request related to a problem? Please describe.
There is no clear documentation on where customer will find the SQL DB creds needed for the config.json files.

Describe the solution you'd like
Provide information and screenshots of the location where the user will find the DB creds needed for the config.json files.

Describe alternatives you've considered
The ARM template deploys the db and outputs the creds for the customer to copy and paste.

How to enable Azure AD SSO for the customer sign-up portal?

Is your feature request related to a problem? Please describe.
I published a SaaS solution to the Marketplace, however my customers can't sign in into https://xxxx-portal.azurewebsites.net/ after subscribing in Azure Portal. Clicking "Configure account now" sends them to the page where they can pick an Azure-bound email, but clicking on that account simply loads the same page again.

image

The same effect has going directly to https://xxxx-portal.azurewebsites.net/ and clicking "Sign-in" in the top right.

At one moment I received an email from Partner Center, mentioning the possible cause:

We reviewed your offer and found that landing page does not support Azure Active Directory (Azure AD) single sign-on (SSO) or your Azure AD SSO is mis-configured. Marketplace buyers are authenticated with Azure AD before they can buy your software as a service (SaaS) offer. To avoid abandonment and facilitate activation, you must enable Azure AD SSO for the buyer of your transactable SaaS offer. To comply with these commercial marketplace certification policies, build or update the offer landing page with Azure AD SSO support. Learn more: https://docs.microsoft.com/en-us/azure/marketplace/azure-ad-transactable-saas-landing-page

However, I am not sure how to configure Azure AD SSO correctly.

Currently, it seems that only I can sign in into the portal.

Describe the solution you'd like
I need my customers to be able to enter the portal and view their subscriptions.

Java SDK

Is your feature request related to a problem? Please describe.
The DotNet example is great. A java equivalent would be awesome.

Describe the solution you'd like
An example of a java application that does the same functionality as the Dotnet app would be of great value.

Describe alternatives you've considered
N/A

Additional context
N/A

Add implementation for Batch emit usage

Is your feature request related to a problem? Please describe.
A Yes, Batch emit usage is mostly used feature and it's not implemented. Partners have to implement For loop to achieve batch emit usage.

Describe the solution you'd like
A Implement batch emit usage feature.

Describe alternatives you've considered
A No..

Additional context
Add any other context or screenshots about the feature request here.

Add License Management for Per Seat Base Offers

**Is your feature request related to a problem? Please describe. **
The Accelerator supports seats offers, but not the management of them. It would be nice if it covers this.

Describe the solution you'd like
A clear and concise description of what you want to happen.

Implement licensing management
Your service (website) must allow the admin who has made the purchase to sign in and manage the account. In the case where they have bought multiple seat-based licenses, they should be able to assign these to users within their organization. You might want to consider the following types of licensing:

Open licensing/first-come first-served - Any end-user who discovers your service can sign in to your service, be recognized as belonging to a tenant, and reserve one of the licenses purchased.
Assigned licensing - The admin for the purchase must assign licenses to users.
Other considerations:

Upsell - If a user tries to access your service, but their tenant has no more free licenses, you service could provide them with a temporary license, and use the opportunity to encourage the admin to purchase additional licenses.
Multiple tenant purchases - You should consider whether to allow numerous purchases from the same tenant, and how to treat these in your database. For example, the Contoso Corporation sales team might purchase 50 licenses for their team, and the marketing team purchase 20 licenses for their team, and they might want to keep the account separate.

https://docs.microsoft.com/en-us/office/dev/store/monetize-addins-through-microsoft-commercial-marketplace#implement-licensing-management

Additional context
Add any other context or screenshots about the feature request here.

Renaming of Solution and Client Library

Update and move the client library code to its new repository.
Add submodule of the client library repo to this repo.
Update documentation to provide developers information on how to clone with submodules.

check readme graphic

if we agree that the graphic is needed, then clarify inconsistent terminology

  • azure marketplace > commercial marketplace
  • Azure commerce engine > saas fulfillment API, marketplace metering service API
  • marketplace token > AAD or access token?
  • partner environment > publisher environment
  • AAD graphics > document meaning or remove

MeteringUsageResult.Quantity must be double, not long

Describe the bug

System.Text.Json.JsonException: The JSON value could not be converted to System.Int64. Path: $.result[0].quantity | LineNumber: 0 | BytePositionInLine: 342.
 ---> System.FormatException: Either the JSON value is not in a supported format, or is out of bounds for an Int64.
   at System.Text.Json.Utf8JsonReader.GetInt64()
   at System.Text.Json.Serialization.Converters.JsonConverterInt64.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options)
   at System.Text.Json.JsonPropertyInfoNotNullable`4.OnRead(ReadStack& state, Utf8JsonReader& reader)
   at System.Text.Json.JsonPropertyInfo.Read(JsonTokenType tokenType, ReadStack& state, Utf8JsonReader& reader)
   at System.Text.Json.JsonSerializer.ReadCore(JsonSerializerOptions options, Utf8JsonReader& reader, ReadStack& readStack)
   --- End of inner exception stack trace ---
   at System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStack& readStack, Utf8JsonReader& reader, Exception ex)
   at System.Text.Json.JsonSerializer.ReadCore(JsonSerializerOptions options, Utf8JsonReader& reader, ReadStack& readStack)
   at System.Text.Json.JsonSerializer.ReadCore(Type returnType, JsonSerializerOptions options, Utf8JsonReader& reader)
   at System.Text.Json.JsonSerializer.Deserialize(String json, Type returnType, JsonSerializerOptions options)
   at System.Text.Json.JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options)
   at Microsoft.Marketplace.SaaS.SDK.Client.Network.WebRequestHelper.BuildResultFromResponse[T]() in D:\a\1\s\src\SaaS.SDK.Client\Network\WebRequestHelper.cs:line 166
   at Microsoft.Marketplace.SaasKit.Network.AbstractSaaSApiRestClient`1.DoRequest(String url, String method, Dictionary`2 parameters, Dictionary`2 headers, String contentType) in D:\a\1\s\src\SaaS.SDK.Client\Network\AbstractSaaSApiRestClient.cs:line 87
   at Microsoft.Marketplace.SaasKit.Services.MeteredBillingApiClient.EmitBatchUsageEventAsync(IEnumerable`1 subscriptionBatchUsageRequest) in D:\a\1\s\src\SaaS.SDK.Client\Services\MeteredBillingAPIClient.cs:line 95

To Reproduce
Submit MeteringUsageRequest with non-integer Quantity

Expected behavior
Emit should succeed

Unsubscribe action for Landing Page.

Is your feature request related to a problem? Please describe.
Buyers can't unsubscribed using the subscription menu

Describe the solution you'd like
Add one more option in the subscription menu to allow users to unsubscribe

Describe alternatives you've considered
Buyers can use the Azure portal to unsubscribe, but it would be a good option to have.

Additional context
Add any other context or screenshots about the feature request here.

'System.IO.DirectoryNotFoundException: Could not find a part of the path 'D:\home\site\wwwroot\runtimes\unix\'.

Bug Description
First of all, Thanks for the great application. Unfortunately I am unable to deploy successfully. The ARM template deployment step gives the following error.

.\Deploy.ps1 -WebAppNamePrefix "XXXXXXXX" -TenantID "XXXXXX" -ADApplicationID "XXXXX" -ADApplicationSecret "XXXXX" -SQLServerName "XXXXX" -SQLAdminLogin "XXXXXX" -SQLAdminLoginPassword "XXXXX" -PublisherAdminUsers "XXXXXXX" -BacpacUrl "someurl" -ResourceGroupForDeployment "XXXXX" -Location "East US" -AzureSubscriptionID "XXXXX" -PathToARMTemplate "\path\to\deploy.json"

(actual values masked for security)

Package deployment failed AppGallery Deploy Failed: 'System.IO.DirectoryNotFoundException: Could not find a part of the path 'D:\home\site\wwwroot\runtimes\unix\'. at Microsoft.Web.Deployment.NativeMethods.RaiseIOExceptionFromErrorCode(Win32ErrorCode errorCode, String maybeFullPath) at Microsoft.Web.Deployment.FileStreamEx.CreateInstance(String path, FileMode fileMode, FileAccess fileAccess, FileShare fileShare, Nullable 1 fileLength) at Microsoft.Web.Deployment.FilePathProviderBase.Add(DeploymentObject source, Boolean whatIf) at Microsoft.Web.Deployment.DeploymentObject.AddChild(DeploymentObject source, Int32 position, DeploymentSyncContext syncContext) at Microsoft.Web.Deployment.DeploymentSyncContext.HandleAddChild(DeploymentObject destParent, DeploymentObject sourceObject, Int32 position) at Microsoft.Web.Deployment.DeploymentSyncContext.SyncDirPathChildren(DeploymentObject destRoot, DeploymentObject sourceRoot) at Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildren(DeploymentObject dest, DeploymentObject source) at Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildrenNoOrder(DeploymentObject dest, DeploymentObject source) at Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildren(DeploymentObject dest, DeploymentObject source) at Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildrenOrder(DeploymentObject dest, DeploymentObject source) at Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildren(DeploymentObject dest, DeploymentObject source) at Microsoft.Web.Deployment.DeploymentSyncContext.ProcessSync(DeploymentObject destinationObject, DeploymentObject sourceObject) at Microsoft.Web.Deployment.DeploymentObject.SyncToInternal(DeploymentObject destObject, DeploymentSyncOptions syncOptions, PayloadTable payloadTable, ContentRootTable contentRootTable, Nullable1 syncPassId, String syncSessionId) at Microsoft.Web.Deployment.DeploymentObject.SyncTo(DeploymentProviderOptions providerOptions, DeploymentBaseOptions baseOptions, DeploymentSyncOptions syncOptions) at Microsoft.Web.Deployment.DeploymentObject.SyncTo(String provider, String path, DeploymentBaseOptions baseOptions, DeploymentSyncOptions syncOptions) at Microsoft.Web.Deployment.DeploymentObject.SyncTo(DeploymentWellKnownProvider provider, String path, DeploymentBaseOptions baseOptions, DeploymentSyncOptions syncOptions) at Microsoft.Web.Deployment.WebApi.AppGalleryPackage.Deploy(String deploymentSite, String siteSlotId, Boolean doNotDelete) at Microsoft.Web.Deployment.WebApi.DeploymentController.&amp;lt;DownloadAndDeployPackage&amp;gt;d__24.MoveNext()' Package deployment failed

To Reproduce
Follow step by step the instructions provided. In the end, the deploy step always fails with the error above. I have tried removing the entire resource group and rerunning the whole script.
The script fails at the point where it says "Deploying the ARM template to set up resources"

Expected behavior
All resources should be deployed successfully without any errors.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: Windows 10 Pro
  • Browser - Chrome
  • Version 83.0.4103.116 (Official Build) (64-bit)

Additional context
Add any other context about the problem here.

Admin page for the email template

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
As a Publisher,
I would like to have a page to edit the SaaS Accelerator Email Template,
So I dont have to edit it on the database

Describe the solution you'd like
A clear and concise description of what you want to happen.
A page under the admin settings to update the template config

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Add a Configuration page for email configuration.

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
As a Publisher,
I would like to have a page under the admin page that will help configure the email server configuration,
So, I don't have to update the database directly.

Describe the solution you'd like
A clear and concise description of what you want to happen.
User must have an Admin page where the user can update the email server configuration.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Marketplace API resource value updated in the docs

Is your feature request related to a problem? Please describe.
There has been a forward update to use a different resource guid. Please docs

Describe the solution you'd like
Made changes and raised PR #90

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Add an admin page to update logos

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
As a Publisher,
I would like to have an admin page to change logo,
So, I don't need my dev team to change it

Describe the solution you'd like
A clear and concise description of what you want to happen.
A page on the admin section to upload the new logo (.png and .ico).

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

WebApp support of environmental variables.

Is your feature request related to a problem? Please describe.
Customer wants to use WebApps environmental variable, so they can pass their KeyVault values,

Describe the solution you'd like
I would like the WebApp to take the environmental variables from the WebApp Settings and if there are none setup then use the config.json file as usual.

Webhook authentication improvement

Is your feature request related to a problem? Please describe.
Check the webhook authentication

Describe the solution you'd like
Implement webhook authentication

Describe alternatives you've considered
Validate the operation before going forward with processing the notification

Additional context
Add any other context or screenshots about the feature request here.

Use Command Line to create AD Registration

**Is your feature request related to a problem? Please describe. **
Use Command Line to create AD Registration

Describe the solution you'd like
I would like the command line deployment to create the AAD Registrations to improve UX

Metering Batch Uplolad in UI

Is your feature request related to a problem? Please describe.
Allow partners to submit the metering data using a templated file using on the UI

Describe the solution you'd like
On the Partner Provisioning Page provide a page to download a template, so partner can fill it and then upload it, validate and push to the metering at an chosen specific time. The upload should be logged.

Describe alternatives you've considered
Use the API directly

Additional context
Add any other context or screenshots about the feature request here.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.