{"id":38200159,"url":"https://github.com/thomasduft/openiddict-ui","last_synced_at":"2026-01-17T00:28:03.809Z","repository":{"id":37698111,"uuid":"309673840","full_name":"thomasduft/openiddict-ui","owner":"thomasduft","description":"A headless UI for the OpenIddict-Core stack.","archived":false,"fork":false,"pushed_at":"2025-12-22T10:48:15.000Z","size":6289,"stargazers_count":316,"open_issues_count":3,"forks_count":44,"subscribers_count":14,"default_branch":"main","last_synced_at":"2025-12-23T21:48:52.841Z","etag":null,"topics":["aspnetcore","dotnet","oidc","openiddict","ui"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thomasduft.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-11-03T12:05:53.000Z","updated_at":"2025-12-22T10:48:19.000Z","dependencies_parsed_at":"2024-04-19T09:26:58.951Z","dependency_job_id":"8935df63-e340-4bb7-84cf-7ac39b20030b","html_url":"https://github.com/thomasduft/openiddict-ui","commit_stats":{"total_commits":259,"total_committers":3,"mean_commits":86.33333333333333,"dds":"0.10810810810810811","last_synced_commit":"bf3e7f0e8ee8212097b8ca762e48dd38ee990907"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/thomasduft/openiddict-ui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomasduft%2Fopeniddict-ui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomasduft%2Fopeniddict-ui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomasduft%2Fopeniddict-ui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomasduft%2Fopeniddict-ui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thomasduft","download_url":"https://codeload.github.com/thomasduft/openiddict-ui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomasduft%2Fopeniddict-ui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28490097,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T23:55:29.509Z","status":"ssl_error","status_checked_at":"2026-01-16T23:55:29.108Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aspnetcore","dotnet","oidc","openiddict","ui"],"created_at":"2026-01-17T00:28:03.359Z","updated_at":"2026-01-17T00:28:03.786Z","avatar_url":"https://github.com/thomasduft.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\r\n\r\n| Type                        | Description                                                  | Badge                                                        |\r\n| :-------------------------- | :----------------------------------------------------------- | :----------------------------------------------------------- |\r\n| Build                       | Build status                                                 | [![build](https://github.com/thomasduft/openiddict-ui/workflows/build/badge.svg)](https://github.com/thomasduft/openiddict-ui/actions) |\r\n| OpenIddict-UI API           | API's for managing OpentIddict `Scopes` and `Applications`.  | [![NuGet Release](https://img.shields.io/nuget/vpre/tomware.OpenIddict.UI.Api.svg)](https://www.nuget.org/packages/tomware.OpenIddict.UI.Api) |\r\n| OpentIddict-UI Identity API | API's for managing [ASP.NET Core Identity](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-5.0\u0026tabs=visual-studio) types (Accounts, Roles, etc.). | [![NuGet Release](https://img.shields.io/nuget/vpre/tomware.OpenIddict.UI.Identity.Api.svg)](https://www.nuget.org/packages/tomware.OpenIddict.UI.Identity.Api) |\r\n\r\n# OpenIddict UI\r\n\r\nA first step to provide some headless UI features to the [OpenIddict](https://github.com/openiddict/openiddict-core) stack. \r\n\r\n\u003e Please note that this project does not provide you a ready to use UI instead provides you the required services that allow you to build one. You can use the samples as a starting point though.\r\n\r\nCurrently it provides API's for managing `Scopes` and `Applications`.\r\n\r\nOn top of that it ships API's for the `Usermanagement` when using [ASP.NET Core Identity](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-5.0\u0026tabs=visual-studio).\r\n\r\nAs a goodie the samples demonstrates this features by an Angular SPA client that uses the [Authorization Code flow](https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth).\r\n\r\n![SPA Client](./spa-client.png)\r\n\r\n## Running the sample\r\n\r\nAssuming you downloaded the sources and opened [VS Code](https://code.visualstudio.com/) in the root repo directory you should be good to go! Ahh and of course you need [.NET Core](https://dotnet.microsoft.com/download) and [node.js](https://nodejs.org/en/) installed on your development environment.\r\n\r\n### Running the sample Server\r\n\r\n1. Open the integrated terminal in VS Code and type\r\n\r\n```bash\r\ndotnet build\r\n```\r\n\r\nThat ensures you are able to build the dotnet related stuff!\r\n\r\n2. Go to the VS Code Debug tab (Ctrl+Shift+D) and run the Server project.\r\n\r\n### Develop the sample Client (Angular based frontend)\r\n\r\n1. Make sure you installed [Node.js](https://nodejs.org/en/). \r\n\r\n\u003e If you develop in a [devcontainer](https://code.visualstudio.com/docs/remote/containers) then you are already good to go!\r\n\r\n2. First run the backend (see previous chapter)\r\n\r\n3. After the Server is running navigate within your favorite command line to the `Client` directory and type:\r\n\r\n```bash\r\nnpm i\r\n```\r\n\r\nThis will install all the Client's required dependencies.\r\n\r\n```bash\r\nnpm run start\r\n```\r\n\r\nThis will start Angular's development server.\r\n\r\n4. Now open your browser of choice and point to the well known Angular dev url.\r\n\r\n```bash\r\nhttp://localhost:4200\r\n```\r\n\r\nYou should see now the login screen. You can now login with the pre-configured administrator users account which is:\r\n\r\n- E-Mail: admin@openiddict.com\r\n- Password: Pass123$\r\n\r\n\r\n## Using it\r\n\r\nFollow the original setup of the OpenIddict in the `Startup.ConfigureServices(...)` - method and add your required additional extension hooks `AddUIStore(...)`, `AddUIApis(...)`, `AddUIIdentityStore\u003cTIdentityUser\u003e(...)` and `AddUIIdentityApis\u003cTIdentityUser\u003e()`.\r\n\r\n```csharp\r\n...\r\nservices.AddOpenIddict()\r\n  // Register the OpenIddict core components.\r\n  .AddCore(options =\u003e\r\n  {\r\n    ...\r\n  })\r\n  // Register the OpenIddict server components.\r\n  .AddServer(options =\u003e\r\n  {\r\n    ...\r\n  })\r\n  // Register the OpenIddict validation components.\r\n  .AddValidation(options =\u003e\r\n  {\r\n    ...\r\n  })\r\n  // Register the EF based UI Store for OpenIddict related entities.\r\n  .AddUIStore(options =\u003e\r\n  {\r\n    options.OpenIddictUIContext = builder =\u003e\r\n      builder.UseSqlite(Configuration.GetConnectionString(\"DefaultConnection\"),\r\n        sql =\u003e sql.MigrationsAssembly(typeof(Startup)\r\n                  .GetTypeInfo()\r\n                  .Assembly\r\n                  .GetName()\r\n                  .Name));\r\n  })\r\n  // Register the APIs for the EF based UI Store based on OpenIddict.\r\n  .AddUIApis(options =\u003e\r\n  {\r\n    // Tell the system about the allowed Permissions it is built/configured for.\r\n    options.Permissions = new List\u003cstring\u003e\r\n    {\r\n      Permissions.Endpoints.Authorization,\r\n      Permissions.Endpoints.Logout,\r\n      Permissions.Endpoints.Token,\r\n      Permissions.GrantTypes.AuthorizationCode,\r\n      Permissions.GrantTypes.Password,\r\n      Permissions.GrantTypes.RefreshToken,\r\n      Permissions.ResponseTypes.Code,\r\n      Permissions.Scopes.Email,\r\n      Permissions.Scopes.Profile,\r\n      Permissions.Scopes.Roles,\r\n      Permissions.Prefixes.Scope + \"demo_api\"\r\n    }\r\n  })\r\n  // Register the EF based UI Store for the ASP.NET Identity related entities.\r\n  .AddUIIdentityStore\u003cApplicationUser\u003e(options =\u003e\r\n  {\r\n    options.OpenIddictUIIdentityContext = builder =\u003e\r\n     builder.UseSqlite(Configuration.GetConnectionString(\"DefaultConnection\"),\r\n       sql =\u003e sql.MigrationsAssembly(typeof(Startup)\r\n                 .GetTypeInfo()\r\n                 .Assembly\r\n                 .GetName()\r\n                 .Name));\r\n  })\r\n  // Register the APIs for the EF based UI Store based on ASP.NET Identity.\r\n  .AddUIIdentityApis\u003cApplicationUser\u003e();\r\n...\r\n```\r\n\r\n## Change the type of primary key used for IdentityUser\r\n\r\nIf your ApplicationUser class derives from an IdentityUser class where the key type is specified (e.g. `IdentityUser\u003cGuid\u003e`) this key must also be supplied to AddUIIdentityStore and AddUIIdentityApis. e.g.\r\n\r\nAn example project using INT as the primary key is included in the samples/ServerWithCustomKey project.\r\n\r\n```csharp\r\n...\r\n  .AddUIIdentityStore\u003cApplicationUser, int\u003e(options =\u003e\r\n  {\r\n    ...\r\n  })\r\n  // Register the APIs for the EF based UI Store based on ASP.NET Identity.\r\n  .AddUIIdentityApis\u003cApplicationUser, int\u003e();\r\n...\r\n```\r\n\r\n## Thoughts and ideas\r\n\r\nThe project is still very young and there are a lot of ideas like:\r\n\r\n- Provide API's for the `Authorization` and `Token` entities (if then really required).\r\n- Provide a [ASP.NET Razor Page](https://docs.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-5.0\u0026tabs=visual-studio) based UI.\r\n- Possibility to manage translated display names based on supported languages etc.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthomasduft%2Fopeniddict-ui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthomasduft%2Fopeniddict-ui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthomasduft%2Fopeniddict-ui/lists"}