Getting started
+ +To use OpenIddict, you need to:
+-
+
Install the latest .NET Core 2.x tooling and update your packages to reference the ASP.NET Core 2.x packages.
+
+Have an existing project or create a new one: when creating a new project using Visual Studio's default ASP.NET Core template, using individual user accounts authentication is strongly recommended. When updating an existing project, you must provide your own
+AccountController
to handle the registration process and the authentication flow.
+Add the appropriate MyGet repositories to your NuGet sources. This can be done by adding a new
+NuGet.Config
file at the root of your solution:<?xml version="1.0" encoding="utf-8"?> +<configuration> +<packageSources> + <add key="NuGet" value="https://api.nuget.org/v3/index.json" /> + <add key="aspnet-contrib" value="https://www.myget.org/F/aspnet-contrib/api/v3/index.json" /> +</packageSources> +</configuration> +
+Update your
+.csproj
file to referenceAspNet.Security.OAuth.Validation
and theOpenIddict
packages:<PackageReference Include="AspNet.Security.OAuth.Validation" Version="2.0.0-*" /> +<PackageReference Include="OpenIddict" Version="2.0.0-*" /> +<PackageReference Include="OpenIddict.EntityFrameworkCore" Version="2.0.0-*" /> +<PackageReference Include="OpenIddict.Mvc" Version="2.0.0-*" /> +
+Configure the OpenIddict services in
+Startup.ConfigureServices
:public void ConfigureServices(IServiceCollection services) +{ + services.AddMvc(); + + services.AddDbContext<ApplicationDbContext>(options => + { + // Configure the context to use Microsoft SQL Server. + options.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"]); + + // Register the entity sets needed by OpenIddict. + // Note: use the generic overload if you need + // to replace the default OpenIddict entities. + options.UseOpenIddict(); + }); + + // Register the Identity services. + services.AddIdentity<ApplicationUser, IdentityRole>() + .AddEntityFrameworkStores<ApplicationDbContext>() + .AddDefaultTokenProviders(); + + // Register the OAuth2 validation handler. + services.AddAuthentication() + .AddOAuthValidation(); + + // Register the OpenIddict services. + // Note: use the generic overload if you need + // to replace the default OpenIddict entities. + services.AddOpenIddict(options => + { + // Register the Entity Framework stores. + options.AddEntityFrameworkCoreStores<ApplicationDbContext>(); + + // Register the ASP.NET Core MVC binder used by OpenIddict. + // Note: if you don't call this method, you won't be able to + // bind OpenIdConnectRequest or OpenIdConnectResponse parameters. + options.AddMvcBinders(); + + // Enable the token endpoint (required to use the password flow). + options.EnableTokenEndpoint("/connect/token"); + + // Allow client applications to use the grant_type=password flow. + options.AllowPasswordFlow(); + + // During development, you can disable the HTTPS requirement. + options.DisableHttpsRequirement(); + }); +} +
+Note: for more information about the different options and configurations available, check out +Configuration and options +in the project wiki.
+
+Make sure the authentication middleware is registered before all the other middleware, including
+app.UseMvc()
:public void Configure(IApplicationBuilder app) +{ + app.UseAuthentication(); + + app.UseMvc(); +} +
+Update your Entity Framework Core context registration to register the OpenIddict entities:
+services.AddDbContext<ApplicationDbContext>(options => +{ + // Configure the context to use Microsoft SQL Server. + options.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"]); + + // Register the entity sets needed by OpenIddict. + // Note: use the generic overload if you need + // to replace the default OpenIddict entities. + options.UseOpenIddict(); +}); +
+Note: if you change the default entity primary key (e.g. to
+int
orGuid
instead ofstring
), make sure to use theservices.AddOpenIddict()
extension accepting aTKey
generic argument and use the genericoptions.UseOpenIddict<TKey>()
overload.
+Create your own authorization controller:
+To support the password or the client credentials flow, you must provide your own token endpoint action. +To enable authorization code/implicit flows support, you'll similarly have to create your own authorization endpoint action and your own views/view models.
+The Mvc.Server sample comes with an
+AuthorizationController
that supports both the password flow and the authorization code flow and that you can easily reuse in your application.
+Enable the corresponding flows in the OpenIddict options:
+public void ConfigureServices(IServiceCollection services) +{ + // Register the OpenIddict services. + // Note: use the generic overload if you need + // to replace the default OpenIddict entities. + services.AddOpenIddict(options => + { + // Register the Entity Framework stores. + options.AddEntityFrameworkCoreStores<ApplicationDbContext>(); + + // Register the ASP.NET Core MVC binder used by OpenIddict. + // Note: if you don't call this method, you won't be able to + // bind OpenIdConnectRequest or OpenIdConnectResponse parameters. + options.AddMvcBinders(); + + // Enable the authorization and token endpoints (required to use the code flow). + options.EnableAuthorizationEndpoint("/connect/authorize") + .EnableTokenEndpoint("/connect/token"); + + // Allow client applications to use the code flow. + options.AllowAuthorizationCodeFlow(); + + // During development, you can disable the HTTPS requirement. + options.DisableHttpsRequirement(); + }); +} +
+Register your client application:
+// Create a new service scope to ensure the database context is correctly disposed when this methods returns. +using (var scope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) +{ + var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); + await context.Database.EnsureCreatedAsync(); + + // Note: when using a custom entity or a custom key type, replace OpenIddictApplication by the appropriate type. + var manager = scope.ServiceProvider.GetRequiredService<OpenIddictApplicationManager<OpenIddictApplication>>(); + + if (await manager.FindByClientIdAsync("[client identifier]", cancellationToken) == null) + { + var descriptor = new OpenIddictApplicationDescriptor + { + ClientId = "[client identifier]", + ClientSecret = "[client secret]", + RedirectUris = { new Uri("[redirect uri]") } + }; + + await manager.CreateAsync(descriptor, cancellationToken); + } +} +
+