Startup¶
IdentityServer is a combination of middleware and services. All configuration is done in your startup class.
Configuring services¶
You add the IdentityServer services to the DI system by calling:
public void ConfigureServices(IServiceCollection services)
{
var builder = services.AddIdentityServer();
}
Optionally you can pass in options into this call. See here for details on options.
This will return you a builder object that in turn has a number of convenience methods to wire up additional services.
Key material
AddSigningCredential- Adds a signing key service that provides the specified key material to the various token creation/validation services.
You can pass in either an
X509Certificate2, aSigningCredentialor a reference to a certificate from the certificate store.
AddTemporarySigningCredential- Creates temporary key material at startup time. This is for dev only scenarios when you don’t have a certificate to use.
AddDeveloperSigningCredential- Same purpose as the temporary signing credential. But this version persists the key to the file system so it stays stable between server restarts. This addresses issues when the client/api metadata caches get out of sync during development.
AddValidationKeys- Adds keys for validating tokens. They will be used by the internal token validator and will show up in the discovery document. This is useful for key roll-over scenarios.
In-Memory configuration stores
The various “in-memory” configuration APIs allow for configuring IdentityServer from an in-memory list of configuration objects. These “in-memory” collections can be hard-coded in the hosting application, or could be loaded dynamically from a configuration file or a database. By design, though, these collections are only created when the hosting application is starting up.
Use of these configuration APIs are designed for use when prototyping, developing, and/or testing where it is not necessary to dynamically consult database at runtime for the configuration data. This style of configuration might also be appropriate for production scenarios if the configuration rarely changes, or it is not inconvenient to require restarting the application if the value must be changed.
AddInMemoryClients- Registers
IClientStoreandICorsPolicyServiceimplementations based on the in-memory collection ofClientconfiguration objects.
AddInMemoryIdentityResources- Registers
IResourceStoreimplementation based on the in-memory collection ofIdentityResourceconfiguration objects.
AddInMemoryApiResources- Registers
IResourceStoreimplementation based on the in-memory collection ofApiResourceconfiguration objects.
Test stores
The TestUser class models a user, their credentials, and claims in IdentityServer.
Use of TestUser is simiar to the use of the “in-memory” stores in that it is intended for when prototyping, developing, and/or testing.
The use of TestUser is not recommended in production.
AddTestUsers- Registers
TestUserStorebased on a collection ofTestUserobjects.TestUserStoreis used by the default quickstart UI. Also registers implementations ofIProfileServiceandIResourceOwnerPasswordValidator.
Additional services
AddExtensionGrantValidator- Adds
IExtensionGrantValidatorimplementation for use with extension grants.
AddSecretParser- Adds
ISecretParserimplementation for parsing client or API resource credentials.
AddSecretValidator- Adds
ISecretValidatorimplementation for validating client or API resource credentials against a credential store.
AddResourceOwnerValidator- Adds
IResourceOwnerPasswordValidatorimplementation for validating user credentials for the resource owner password credentials grant type.
AddProfileService- Adds
IProfileServiceimplementation for connecting to your custom user profile store. TheDefaultProfileServiceclass provides the default implementation which relies upon the authentication cookie as the only source of claims for issuing in tokens.
AddAuthorizeInteractionResponseGenerator- Adds
IAuthorizeInteractionResponseGeneratorimplementation to customize logic at authorization endpoint for when a user must be shown a UI for error, login, consent, or any other custom page. TheAuthorizeInteractionResponseGeneratorclass provides a default implementation, so consider deriving from this existing class if you need to augment the existing behavior.
AddCustomAuthorizeRequestValidator- Adds
ICustomAuthorizeRequestValidatorimplementation to customize request parameter validation at the authorization endpoint.
AddCustomTokenRequestValidator- Adds
ICustomTokenRequestValidatorimplementation to customize request parameter validation at the token endpoint.
Caching
Client and resource configuration data is used frequently by IdentityServer. If this data is being loaded from a database or other external store, then it might be expensive to frequently re-load the same data.
AddClientStoreCache- Registers a
IClientStoredecorator implementation which will maintain an in-memory cache ofClientconfiguration objects. The cache duration is configurable on theCachingconfiguration options on theIdentityServerOptions.
AddResourceStoreCache- Registers a
IResourceStoredecorator implementation which will maintain an in-memory cache ofIdentityResourceandApiResourceconfiguration objects. The cache duration is configurable on theCachingconfiguration options on theIdentityServerOptions.
Further customization of the cache is possible:
The default caching relies upon the ICache<T> implementation.
If you wish to customize the caching behavior for the specific configuration objects, you can replace this implementation in the dependency injection system.
The default implementation of the ICache<T> itself relies upon the IMemoryCache interface (and MemoryCache implementation) provided by .NET.
If you wish to customize the in-memory caching behavior, you can replace the IMemoryCache implementation in the dependency injection system.
Configuring the pipeline¶
You need to add IdentityServer to the pipeline by calling:
public void Configure(IApplicationBuilder app)
{
app.UseIdentityServer();
}
There is no additional configuration for the middleware.
Be aware that order matters in the pipeline. For example, you will want to add IdentitySever before the UI framework that implementes the login screen.