HOWTO: Filter NuGet Packages by License
  • 27 Feb 2023
  • 7 Minutes to read
  • Dark
  • PDF

HOWTO: Filter NuGet Packages by License

  • Dark
  • PDF

Article Summary

How to Create NuGet License Filtering Rules

Many NuGet packages found on sites like tend to have some sort of open source license. For a DevOps team, some licenses are fine (like the MIT license), while others are risky (like the GPL license).

This article describes the license detection and blocking feature in ProGet. It shows you how to assign licenses to a package (for easy browsing), how to filter between allowed and unwanted licenses, and finally how to apply these filters to multiple ProGet feeds to save time and resources.

Getting Started by Assigning a License

ProGet can automatically detect the license agreement that a package uses and displays it clearly on the Package Overview page.

A ProGet package has a green 'approved license box in its description.

ProGet ships with a comprehensive list of open source licenses (e.g., MIT, GPL3, etc.), which are referred to as well- known licenses and originate from SPDX. However, ProGet's list is not complete, so you can edit it under Licenses > License Types.

When you create a NuGet feed in ProGet, many packages don't have an assigned license. You may then see this window on the package overview page:

A window on a ProGet Package saying the package cannot be recognized so likely has a custom license.

This means that the package does not have an SPDX identifier or a URL that ProGet cannot implicitly recognize, so it is assumed to have an unknown or custom license. This can happen for a number of reasons

  • No license at all
  • Embedded license file (e.g. 'license.txt')
  • Non-standard license URL

Identifying an unknown license gives you the option to add a new license type. Once you have identified the package's license and assigned it a license type, you can now detect and configure that license in ProGet.

How To Assign a License in ProGet

Step 1: Manually Inspect the NuGet Package

To determine the license of an unknown license, you must download the package or click through to the license URL and manually investigate.

Step 2: Click [Assign License Type to Custom URL]

Once you read the license and confirm the contents, return to the Package Overview page on ProGet and click [Assign License Type to Custom URL] in the red window.

Step 3: Choose the Appropriate License

A pop-up window will appear with a drop-down of SPDX licenses. Choose the most appropriate license after your investigation and click [save].

The "Assign License" window in ProGet, displaying potential SPDX IDs

You can also write your own identifier, not sourced from SPDX, for custom or proprietary licenses.

The "Assign License" window in ProGet with a custom license ID in the SPDX ID textbox.

Note that, for packages with embedded licenses or no licenses at all, a special URL will be used. package:// indicates a file within a specific package version, and packageid:// is simply that package version.

Once you add the license, all other packages with the same SPDX identifier, URL, or file are recognized as this license type.

Checking Licenses Types

Once a new license has been added, you can manage it on the Licenses > License Types page of ProGet.

If you've added a license type incorrectly, you can click on the license's ID and a pop-up will appear to edit the license details.

The "Edit License Type" window displaying options to edit a custom license type.

You can also delete the license type by clicking on the ❌ to the right of the license's URL(s).

ProGet and NuGet Licenses

ProGet has workflows for managing license agreements that make it easy to set up and manage across large teams.

The License Detection and Blocking feature allows administrators to define rules to block or allow downloads based on the NuGet package license. They can also set rules to block downloads for unknown licenses.

These rules can be set at both a global and feed-specific level. This guide describes how you can do both.

License rules allow or deny downloading NuGet packages with specific licenses. Packages with blocked licenses won't be available for download. You can also define rules to block downloads for unknown licenses. This way, you can even restrict the download of a package to investigate its license and completely minimize the risk.

How to Block Unwanted Licenses

You’ll want to block licenses with known problems—a prime example is the GPL license. We’ve gone into detail about how unknowingly using a GPL-licensed package can bring legal risk and greatly cost a company. To stay out of court, use ProGet to set up license detection and blocking rules on your server and across its feeds.

Before License Blocking

Without any license blocking rules, you can freely browse a ProGet feed and download anything. You are unrestricted.

A ProGet Package with a GPL license that is approved for download.

Step 1: Navigate to Manage Feed > Detection & Blocking

Select the ProGet feed to which you want to apply a license rule and navigate to its feed management page. There, select the Detection & Blocking tab.

Step 2: Click [Add License Blocking Rule]

The "Add a License Blocking Rule" display in ProGet, when no other rules have been made

Step 3: Create a License Filter Rule

In the pop-up, select the license you’d like to block from the [License] drop-down menu. It's always a good idea to block GPL-3.0 to avoid lawsuits.
From the [Rule] drop down menu, select “Block this license.”

The "Create License Filter Rule" window in ProGet, showing SPDX ID GPL and a "block this license" option.

Click [Create Rule].

After License Blocking

Now that you’ve created the rule, when you browse to a NuGet package with the blocked license, you will be unable to download it.

A ProGet package with a GPL license that is now blocked from being downloaded.

Adding More Rules

If you want to add more rules to a feed, follow the instructions above. Once you have created rules, they will be listed on the Detection and Blocking tab at the bottom of the screen.

To add more rules, click on [add] above the list.

The License Detection page with rules made, pointing towards where to create more rules.

How to Allow Approved Licenses

ProGet is implicitly set to allow downloads of packages with unknown licenses. You can change this to "block" and then create specific rules for each license you want to allow or block.

Setting a filter for allowing licenses provides guidance for junior team members and helps comply with company policies for third-party software.

Step 1: Repeat Steps 1 and 2 of “How to Block Unwanted Licenses”

Similar to blocking a license, you can set up allowed licenses via the same page and buttons. Navigate to Detection and Blocking and click on [Add License Filter Rule] or [add].

Step 2: Create a License Filter Rule

In the pop-up window, from the License drop-down menu, select the license you’d like to allow. From the Rule drop-down, select “Allow this license.”

Click [Create Rule].

After License Allowing

Now NuGet packages with your configured rule will allow users to download the package.

A ProGet package has a green 'approved license box in its description.

How to Share Rules across All Feeds

It's easy to assume that your ProGet will have more than one feed; dozens, hundreds, perhaps thousands! So we understand that setting the same rule multiple times for multiple feeds is very tedious.

Instead, you can create a license filter rule on a "global" level (e.g. for each feed on the server).

Before a Global Filtering Rule

When you browse the rules of your feed, you’ll see that it lists the rules as “feed-level.”

A zoomed-in display showing the scope level of license blocking rules in ProGet.

Step 1: Navigate to Licenses and Create a new Rule.

Via the top ribbon of ProGet, navigate to Licenses and click on [Create Rule] at the bottom right of the page.

Step 2: Repeat Step 3 of “How to Block Unwanted Licenses”

In the pop-up window, select the license you want to configure on a global level and the rule you want to apply (either allow or block).

Click [Create Rule]

After A Global Filtering Rule

Once you’ve set up a global rule, you’ll see it on each feed’s Detection and Blocking tab…

The license detection page displaying the scope level of multiple license blocking rules.

…or on the Licenses page.
The Global licenses page displaying the global license detecting and blocking rules.


Conflicting Rules

If a feed has two conflicting rules, such as Block and Allow of a single license, the rule with the smaller scope applies.

For example, if Apache-2.0 is allowed at the global level but blocked at the feed level, the feed is governed by the feed-level rule. The same applies in the reverse case ( blocked at global level, allowed at feed level).

If you have a global rule "Block Apache 2.0" and create a feed rule "Allow Apache 2.0", the global rule will not appear on the screen because the feed has adopted the feed rule as a priority.

In the same example, if the Block Apache-2.0 feed rule is deleted, the Allow Apache-2.0 global rule now applies because the rule with the lower scope is dropped.

Filter by Licenses with ProGet

Using ProGet to filter NuGet packages by their licenses provides additional security for your projects. By allowing only verified licenses and blocking known problematic licenses, you avoid headaches and potential litigation.

ProGet's other features, such as NuGet Vulnerability Scanning and setting up restricted NuGet feeds, can also help save resources and reduce risk.

Request a free trial key for ProGet and try the License Detection and Blocking feature today—only available in the paid version of ProGet.

Was this article helpful?

What's Next