Skip to content

Commit ef0227a

Browse files
authored
Merge pull request #975 from DuendeSoftware/mb/standardize-editions
Document licensing details for Business and Enterprise Edition-specific features across IdentityServer docs.
2 parents 7926afe + b3c6972 commit ef0227a

12 files changed

Lines changed: 114 additions & 84 deletions

File tree

src/content/docs/identityserver/configuration/dcr.mdx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,8 @@ create a new ASP.NET Core Web application which will host the Configuration API.
7676
```
7777

7878
:::note
79-
The Configuration API feature is included in the Duende IdentityServer Business
80-
edition license and higher. Use the same license key for IdentityServer and the
81-
Configuration API.
79+
This feature is part of the [Duende IdentityServer Business and Enterprise Edition](https://duendesoftware.com/products/identityserver).
80+
Configure the same license key for IdentityServer and the Configuration API.
8281
:::
8382

8483
4. **Add and configure the client configuration store**

src/content/docs/identityserver/configuration/index.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ The Configuration API is a collection of endpoints that allow for management and
1818
implementation. The Configuration API can be hosted either separately or within the IdentityServer implementation, and is
1919
distributed through the separate [Duende.IdentityServer.Configuration NuGet package](https://www.nuget.org/packages/Duende.IdentityServer.Configuration).
2020

21-
Currently, the Configuration API supports the [Dynamic Client Registration](/identityserver/configuration/dcr.mdx) protocol.
21+
Currently, the Configuration API supports the [Dynamic Client Registration](/identityserver/configuration/dcr.mdx) protocol.
2222

23-
The Configuration API is part of the [Duende IdentityServer](https://duendesoftware.com/products/identityserver) Business Edition or higher. The same [license](https://duendesoftware.com/products/identityserver#pricing)
24-
and [special offers](https://duendesoftware.com/specialoffers) apply.
23+
:::note
24+
This feature is part of the [Duende IdentityServer Business and Enterprise Edition](https://duendesoftware.com/products/identityserver).
25+
:::
2526

2627
The Configuration API source code is available [on GitHub](https://github.com/DuendeSoftware/products/tree/main/identity-server/src/Configuration).
2728

src/content/docs/identityserver/fundamentals/key-management.md

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ material, including
3939
* announcement of upcoming new keys
4040
* maintenance of retired keys
4141

42-
Automatic Key Management is included in [IdentityServer](https://duendesoftware.com/products/identityserver) Business
43-
Edition or higher.
42+
:::note
43+
This feature is part of the [Duende IdentityServer Business and Enterprise Edition](https://duendesoftware.com/products/identityserver).
44+
:::
4445

4546
### Configuration
4647

@@ -60,7 +61,7 @@ has passed, keys are removed from discovery, and optionally deleted.
6061

6162
The default is to rotate keys every 90 days, announce new keys with 14 days of
6263
propagation time, retain old keys for a duration of 14 days, and to delete keys
63-
when they are retired.
64+
when they are retired.
6465

6566
```mermaid
6667
---
@@ -73,12 +74,12 @@ config:
7374
gantt
7475
title 90 Day Key Rotation Schedule per Signing Algorithm
7576
todayMarker off
76-
77+
7778
section RS256
7879
Signing :active, rsa_s, 2025-01-01, 76d
7980
Retire :rsa_r, after rsa_s, 14d
8081
Delete :crit, rsa_d, after rsa_r, 1d
81-
82+
8283
Announce :rsa_na, 2025-03-03, 14d
8384
Signing :active, rsa_ns, after rsa_na, 62d
8485
Retire :rsa_nr, after rsa_ns, 14d
@@ -100,13 +101,13 @@ All of these options are configurable in the `KeyManagement` options. For exampl
100101
```cs
101102
// Program.cs
102103
var idsvrBuilder = builder.Services.AddIdentityServer(options =>
103-
{
104+
{
104105
// new key every 30 days
105106
options.KeyManagement.RotationInterval = TimeSpan.FromDays(30);
106-
107+
107108
// announce new key 2 days in advance in discovery
108109
options.KeyManagement.PropagationTime = TimeSpan.FromDays(2);
109-
110+
110111
// keep old key for 7 days in discovery for validation of tokens
111112
options.KeyManagement.RetentionDuration = TimeSpan.FromDays(7);
112113

@@ -139,7 +140,7 @@ access to the `KeyPath`.
139140
```cs
140141
// Program.cs
141142
var idsvrBuilder = builder.Services.AddIdentityServer(options =>
142-
{
143+
{
143144
// set path to store keys
144145
options.KeyManagement.KeyPath = "/home/shared/keys";
145146
});
@@ -169,7 +170,7 @@ an X.509 certificate. Automatic key management will create and rotate keys for
169170
each signing algorithm you specify.
170171

171172
:::note
172-
*X.509 certificates* have an expiration date, but IdentityServer does
173+
_X.509 certificates_ have an expiration date, but IdentityServer does
173174
not use this data to validate the certificate and throw an exception. If a certificate has expired then you
174175
must decide whether to continue using it or replace it with a new certificate.
175176
:::
@@ -179,10 +180,10 @@ options.KeyManagement.SigningAlgorithms = new[]
179180
{
180181
// RS256 for older clients (with additional X.509 wrapping)
181182
new SigningAlgorithmOptions(SecurityAlgorithms.RsaSha256) { UseX509Certificate = true },
182-
183+
183184
// PS256
184185
new SigningAlgorithmOptions(SecurityAlgorithms.RsaSsaPssSha256),
185-
186+
186187
// ES256
187188
new SigningAlgorithmOptions(SecurityAlgorithms.EcdsaSha256)
188189
};
@@ -200,7 +201,7 @@ resource and client basis.
200201
Instead of using [Automatic Key Management](#automatic-key-management), IdentityServer's signing keys can be set
201202
manually. Automatic Key Management is generally recommended, but if you want to
202203
explicitly control your keys statically, or you have a license that does not
203-
include the feature (e.g. the Starter Edition), you will need to manually manage
204+
include the feature, you will need to manually manage
204205
your keys. With static configuration you are responsible for secure storage,
205206
loading and rotation of keys.
206207

@@ -378,7 +379,7 @@ key as a validation key.
378379
```cs
379380
// Program.cs
380381
var idsvrBuilder = builder.Services.AddIdentityServer(options =>
381-
{
382+
{
382383
options.KeyManagement.Enabled = false;
383384
});
384385

@@ -406,7 +407,7 @@ the signing credential and validation key.
406407
```cs
407408
// Program.cs
408409
var idsvrBuilder = builder.Services.AddIdentityServer(options =>
409-
{
410+
{
410411
options.KeyManagement.Enabled = false;
411412
});
412413

@@ -428,7 +429,7 @@ old key, it is safe to completely remove the old key.
428429

429430
```cs
430431
var idsvrBuilder = builder.Services.AddIdentityServer(options =>
431-
{
432+
{
432433
options.KeyManagement.Enabled = false;
433434
});
434435

@@ -473,7 +474,7 @@ key. IdentityServer will continue to sign keys with your old static key.
473474

474475
```cs
475476
var idsvrBuilder = builder.Services.AddIdentityServer(options =>
476-
{
477+
{
477478
options.KeyManagement.Enabled = true;
478479
});
479480

@@ -491,7 +492,7 @@ keep the old key for validation purposes.
491492

492493
```cs
493494
var idsvrBuilder = builder.Services.AddIdentityServer(options =>
494-
{
495+
{
495496
options.KeyManagement.Enabled = true;
496497
});
497498

@@ -508,7 +509,7 @@ Now the static key configuration can be removed entirely.
508509

509510
```cs
510511
var idsvrBuilder = builder.Services.AddIdentityServer(options =>
511-
{
512+
{
512513
options.KeyManagement.Enabled = true;
513514
});
514515
```

src/content/docs/identityserver/fundamentals/resources/isolation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ redirect_from:
1111
---
1212

1313
:::note
14-
This is an Enterprise Edition feature.
14+
This feature is part of the [Duende IdentityServer Enterprise Edition](https://duendesoftware.com/products/identityserver).
1515
:::
1616

1717
OAuth itself only knows about scopes - the (API) resource concept does not exist from a pure protocol point of view.

src/content/docs/identityserver/overview/specs.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ redirect_from:
1313

1414
Duende IdentityServer implements the following specifications:
1515

16+
:::note
17+
Some specifications are only available in the [Duende IdentityServer Business or Enterprise Edition](https://duendesoftware.com/products/identityserver).
18+
:::
19+
1620
## OpenID Connect
1721

1822
* OpenID Connect Core 1.0 ([spec](https://openid.net/specs/openid-connect-core-1_0.html))

src/content/docs/identityserver/tokens/par.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,11 @@ care, and in other industries with high security requirements.
3434

3535
## Licensing
3636

37-
Duende.IdentityServer includes support for PAR in the Business Edition or higher license. In the starter edition, PAR
38-
requests will not be processed and instead log errors. If you have a starter edition license, you should disable the
37+
:::note
38+
This feature is part of the [Duende IdentityServer Business and Enterprise Edition](https://duendesoftware.com/products/identityserver).
39+
:::
40+
41+
In the Starter edition, PAR requests will not be processed and instead log errors. If you have a starter edition license, you should disable the
3942
`EnablePushedAuthorizationEndpoint` flag so that discovery indicates that your IdentityServer does not support PAR:
4043

4144
```cs
@@ -72,12 +75,13 @@ builder.Services
7275
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, oidcOptions =>
7376
{
7477
// Your authority, client ID, ... configuration goes here.
75-
76-
// By default, PushedAuthorizationBehavior is set to PushedAuthorizationBehavior.UseIfAvailable.
78+
79+
// By default, PushedAuthorizationBehavior is set to PushedAuthorizationBehavior.UseIfAvailable.
7780
// You can also require using PAR:
7881
oidcOptions.PushedAuthorizationBehavior = PushedAuthorizationBehavior.Require;
7982
});
8083
```
84+
8185
.NET 8 does not have built-in support for PAR. If you're using .NET 8, we have a sample of how to implement this flow
8286
available [here](/identityserver/samples/basics.mdx#mvc-client-with-pushed-authorization-requests).
8387

src/content/docs/identityserver/tokens/pop.md

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ redirect_from:
2020

2121
By default, OAuth access tokens are so-called `bearer` tokens. This means they are not bound to a client and anybody who possesses the token can use it. The security concern here is that a leaked token could be used by a (malicious) third party to impersonate the client and/or user.
2222

23-
On the other hand, `Proof-of-Possession` (PoP) tokens are bound to the client that requested the token. This is also often called sender constraining. This is done by using cryptography to prove that the sender of the token knows an additional secret only known to the client.
23+
On the other hand, `Proof-of-Possession` (PoP) tokens are bound to the client that requested the token. This is also often called sender constraining. This is done by using cryptography to prove that the sender of the token knows an additional secret only known to the client.
2424

2525
This proof is called the *confirmation method* and is expressed via the standard [`cnf` claim](https://tools.ietf.org/html/rfc7800),e.g.:
2626

@@ -45,13 +45,14 @@ When using reference tokens, the cnf claim will be returned from the introspecti
4545
IdentityServer supports two styles of proof of possession tokens: **Mutual TLS** and **DPoP**.
4646

4747
## Mutual TLS
48+
4849
[RFC 8705](https://tools.ietf.org/html/rfc8705) specifies how to bind a TLS client certificate to an access token. With this method your IdentityServer will embed the SHA-256 thumbprint of the X.509 client certificate into the access token via the cnf claim, e.g.:
4950

5051
```json
5152
{
5253
// rest omitted
53-
54-
"cnf": { "x5t#S256": "bwcK0esc3ACC3DB2Y5_lESsXE8o9ltc05O89jdN-dg2" }
54+
55+
"cnf": { "x5t#S256": "bwcK0esc3ACC3DB2Y5_lESsXE8o9ltc05O89jdN-dg2" }
5556
}
5657
```
5758

@@ -68,6 +69,7 @@ It is not mandatory to authenticate your clients with a client certificate to ge
6869
In this scenario, the client would create an X.509 certificate on the fly, and use that to establish the TLS channel to your IdentityServer. As long as the certificate is accepted by your web server, your IdentityServer can embed the `cnf` claim, and your APIs can validate it.
6970

7071
#### .NET Client
72+
7173
In .NET it is straight-forward to create an X.509 certificate on the fly and use it to open a TLS connection.
7274

7375
```csharp
@@ -81,19 +83,19 @@ static X509Certificate2 CreateClientCertificate(string name)
8183

8284
request.CertificateExtensions.Add(
8385
new X509KeyUsageExtension(
84-
X509KeyUsageFlags.DataEncipherment |
85-
X509KeyUsageFlags.KeyEncipherment |
86+
X509KeyUsageFlags.DataEncipherment |
87+
X509KeyUsageFlags.KeyEncipherment |
8688
X509KeyUsageFlags.DigitalSignature , false));
8789

8890
request.CertificateExtensions.Add(
8991
new X509EnhancedKeyUsageExtension(
90-
new OidCollection
91-
{
92-
new Oid("1.3.6.1.5.5.7.3.2")
92+
new OidCollection
93+
{
94+
new Oid("1.3.6.1.5.5.7.3.2")
9395
}, false));
9496

9597
return request.CreateSelfSigned(
96-
new DateTimeOffset(DateTime.UtcNow.AddDays(-1)),
98+
new DateTimeOffset(DateTime.UtcNow.AddDays(-1)),
9799
new DateTimeOffset(DateTime.UtcNow.AddDays(10)));
98100
}
99101
}
@@ -112,10 +114,10 @@ static async Task<TokenResponse> RequestTokenAsync()
112114
var response = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
113115
{
114116
Address = disco.MtlsEndpointAliases.TokenEndpoint,
115-
117+
116118
// The default ClientCredentialStyle value is ClientCredentialStyle.AuthorizationHeader, which does not work in a Mutual TLS scenario
117119
ClientCredentialStyle = ClientCredentialStyle.PostBody,
118-
120+
119121
ClientId = "client",
120122
Scope = "api1"
121123
});
@@ -134,14 +136,15 @@ static SocketsHttpHandler GetHandler(X509Certificate2 certificate)
134136
```
135137

136138
#### Enabling Support In IdentityServer
139+
137140
The last step is to enable that feature in the options:
138141

139142
```csharp
140143
// Program.cs
141144
var idsvrBuilder = builder.Services.AddIdentityServer(options =>
142145
{
143146
// other settings
144-
147+
145148
options.MutualTls.AlwaysEmitConfirmationClaim = true;
146149
});
147150
```
@@ -151,8 +154,13 @@ var idsvrBuilder = builder.Services.AddIdentityServer(options =>
151154
**Version:** <span data-shb-badge data-shb-badge-variant="default">&gt;=6.3</span>
152155

153156
[DPoP](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-dpop) is a security measure that addresses token replay
154-
attacks by making it difficult for attackers to use stolen tokens. Support for DPoP is included
155-
in [IdentityServer](https://duendesoftware.com/products/identityserver) Enterprise Edition. DPoP specifies how to bind
157+
attacks by making it difficult for attackers to use stolen tokens.
158+
159+
:::note
160+
This feature is part of the [Duende IdentityServer Enterprise Edition](https://duendesoftware.com/products/identityserver).
161+
:::
162+
163+
DPoP specifies how to bind
156164
an asymmetric key stored within a JSON Web Key (JWK) to an access token. With this enabled your IdentityServer will
157165
embed the thumbprint of the public key JWK into the access token via the cnf claim, e.g.:
158166

@@ -229,7 +237,7 @@ builder.Services.AddAuthentication(...)
229237
.AddCookie("cookie", ...)
230238
.AddOpenIdConnect("oidc", ...);
231239

232-
builder.Services.AddOpenIdConnectAccessTokenManagement(options =>
240+
builder.Services.AddOpenIdConnectAccessTokenManagement(options =>
233241
{
234242
options.DPoPJsonWebKey = "...";
235243
});
@@ -255,4 +263,4 @@ lost, the tokens can longer be used, and if the secret is leaked, the security b
255263
#### Enabling DPoP Support In Your API
256264

257265
See [here](/identityserver/apis/aspnetcore/confirmation.md#validating-dpop) for documentation
258-
describing how to enable DPoP in your APIs.
266+
describing how to enable DPoP in your APIs.

src/content/docs/identityserver/troubleshooting/index.mdx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,13 @@ When dealing with external authentication, you may want to implement `OnTicketRe
304304

305305
### Use Server-side Sessions
306306

307-
If you have a Business Edition or higher license for IdentityServer, then you can use [server-side sessions][2] to store the
307+
You can use [server-side sessions][2] to store the
308308
user's session data in a data store instead of in the cookie. This will greatly reduce the size of the cookie while allowing you to store more data in the session.
309309

310+
:::note
311+
This feature is part of the [Duende IdentityServer Business and Enterprise Edition](https://duendesoftware.com/products/identityserver).
312+
:::
313+
310314
### Implement a Custom `ITicketStore` to Reduce Cookie Size
311315

312316
When configuring the cookie authentication handler, you can provide a custom `ITicketStore` implementation to store the

0 commit comments

Comments
 (0)