diff --git a/astro/.astro/types.d.ts b/astro/.astro/types.d.ts new file mode 100644 index 0000000000..cd9cb7c245 --- /dev/null +++ b/astro/.astro/types.d.ts @@ -0,0 +1,2596 @@ +declare module 'astro:content' { + interface Render { + '.mdx': Promise<{ + Content: import('astro').MarkdownInstance<{}>['Content']; + headings: import('astro').MarkdownHeading[]; + remarkPluginFrontmatter: Record; + }>; + } +} + +declare module 'astro:content' { + interface Render { + '.md': Promise<{ + Content: import('astro').MarkdownInstance<{}>['Content']; + headings: import('astro').MarkdownHeading[]; + remarkPluginFrontmatter: Record; + }>; + } +} + +declare module 'astro:content' { + export { z } from 'astro/zod'; + export type CollectionEntry = + (typeof entryMap)[C][keyof (typeof entryMap)[C]]; + + // This needs to be in sync with ImageMetadata + export const image: () => import('astro/zod').ZodObject<{ + src: import('astro/zod').ZodString; + width: import('astro/zod').ZodNumber; + height: import('astro/zod').ZodNumber; + format: import('astro/zod').ZodUnion< + [ + import('astro/zod').ZodLiteral<'png'>, + import('astro/zod').ZodLiteral<'jpg'>, + import('astro/zod').ZodLiteral<'jpeg'>, + import('astro/zod').ZodLiteral<'tiff'>, + import('astro/zod').ZodLiteral<'webp'>, + import('astro/zod').ZodLiteral<'gif'>, + import('astro/zod').ZodLiteral<'svg'> + ] + >; + }>; + + type BaseSchemaWithoutEffects = + | import('astro/zod').AnyZodObject + | import('astro/zod').ZodUnion + | import('astro/zod').ZodDiscriminatedUnion + | import('astro/zod').ZodIntersection< + import('astro/zod').AnyZodObject, + import('astro/zod').AnyZodObject + >; + + type BaseSchema = + | BaseSchemaWithoutEffects + | import('astro/zod').ZodEffects; + + type BaseCollectionConfig = { + schema?: S; + slug?: (entry: { + id: CollectionEntry['id']; + defaultSlug: string; + collection: string; + body: string; + data: import('astro/zod').infer; + }) => string | Promise; + }; + export function defineCollection( + input: BaseCollectionConfig + ): BaseCollectionConfig; + + type EntryMapKeys = keyof typeof entryMap; + type AllValuesOf = T extends any ? T[keyof T] : never; + type ValidEntrySlug = AllValuesOf<(typeof entryMap)[C]>['slug']; + + export function getEntryBySlug< + C extends keyof typeof entryMap, + E extends ValidEntrySlug | (string & {}) + >( + collection: C, + // Note that this has to accept a regular string too, for SSR + entrySlug: E + ): E extends ValidEntrySlug + ? Promise> + : Promise | undefined>; + export function getCollection>( + collection: C, + filter?: (entry: CollectionEntry) => entry is E + ): Promise; + export function getCollection( + collection: C, + filter?: (entry: CollectionEntry) => unknown + ): Promise[]>; + + type InferEntrySchema = import('astro/zod').infer< + Required['schema'] + >; + + const entryMap: { + "articles": { +"authentication/avoid-lockin.md": { + id: "authentication/avoid-lockin.md", + slug: "authentication/avoid-lockin", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"authentication/common-authentication-implementation-risks.md": { + id: "authentication/common-authentication-implementation-risks.md", + slug: "authentication/common-authentication-implementation-risks", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"authentication/developer-benefits-single-sign-on.md": { + id: "authentication/developer-benefits-single-sign-on.md", + slug: "authentication/developer-benefits-single-sign-on", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"authentication/how-sso-works.mdx": { + id: "authentication/how-sso-works.mdx", + slug: "authentication/how-sso-works", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"authentication/index.mdx": { + id: "authentication/index.mdx", + slug: "authentication", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"authentication/login-failures.md": { + id: "authentication/login-failures.md", + slug: "authentication/login-failures", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"authentication/multi-factor-authentication.md": { + id: "authentication/multi-factor-authentication.md", + slug: "authentication/multi-factor-authentication", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"authentication/types-of-kubernetes-auth.md": { + id: "authentication/types-of-kubernetes-auth.md", + slug: "authentication/types-of-kubernetes-auth", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"authentication/webauthn-explained.md": { + id: "authentication/webauthn-explained.md", + slug: "authentication/webauthn-explained", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"ciam/auth-and-the-bottleneck-architecture.md": { + id: "ciam/auth-and-the-bottleneck-architecture.md", + slug: "ciam/auth-and-the-bottleneck-architecture", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"ciam/auth-facade-pattern.md": { + id: "ciam/auth-facade-pattern.md", + slug: "ciam/auth-facade-pattern", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"ciam/challenges-of-ciam.mdx": { + id: "ciam/challenges-of-ciam.mdx", + slug: "ciam/challenges-of-ciam", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"ciam/ciam-vs-iam.md": { + id: "ciam/ciam-vs-iam.md", + slug: "ciam/ciam-vs-iam", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"ciam/demise-of-third-party-cookies-running-own-ciam.md": { + id: "ciam/demise-of-third-party-cookies-running-own-ciam.md", + slug: "ciam/demise-of-third-party-cookies-running-own-ciam", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"ciam/developers-guide-to-gdpr.md": { + id: "ciam/developers-guide-to-gdpr.md", + slug: "ciam/developers-guide-to-gdpr", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"ciam/index.mdx": { + id: "ciam/index.mdx", + slug: "ciam", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"ciam/making-sure-your-auth-system-scales.md": { + id: "ciam/making-sure-your-auth-system-scales.md", + slug: "ciam/making-sure-your-auth-system-scales", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"ciam/unlocking-growth-low-friction-signup-process.md": { + id: "ciam/unlocking-growth-low-friction-signup-process.md", + slug: "ciam/unlocking-growth-low-friction-signup-process", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"ciam/what-is-ciam.md": { + id: "ciam/what-is-ciam.md", + slug: "ciam/what-is-ciam", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"gaming-entertainment/benefits-self-hosting-reduce-latency.md": { + id: "gaming-entertainment/benefits-self-hosting-reduce-latency.md", + slug: "gaming-entertainment/benefits-self-hosting-reduce-latency", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"gaming-entertainment/best-practices-spiky-registration.md": { + id: "gaming-entertainment/best-practices-spiky-registration.md", + slug: "gaming-entertainment/best-practices-spiky-registration", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"gaming-entertainment/cross-platform-game-accounts.md": { + id: "gaming-entertainment/cross-platform-game-accounts.md", + slug: "gaming-entertainment/cross-platform-game-accounts", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"gaming-entertainment/gaming-identity-provider-needs.md": { + id: "gaming-entertainment/gaming-identity-provider-needs.md", + slug: "gaming-entertainment/gaming-identity-provider-needs", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"gaming-entertainment/index.mdx": { + id: "gaming-entertainment/index.mdx", + slug: "gaming-entertainment", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"gaming-entertainment/oauth-device-grant-gaming.md": { + id: "gaming-entertainment/oauth-device-grant-gaming.md", + slug: "gaming-entertainment/oauth-device-grant-gaming", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"gaming-entertainment/securing-game-account.md": { + id: "gaming-entertainment/securing-game-account.md", + slug: "gaming-entertainment/securing-game-account", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"identity-basics/complete-authentication-system.md": { + id: "identity-basics/complete-authentication-system.md", + slug: "identity-basics/complete-authentication-system", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"identity-basics/due-diligence-authentication-vendors.md": { + id: "identity-basics/due-diligence-authentication-vendors.md", + slug: "identity-basics/due-diligence-authentication-vendors", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"identity-basics/index.mdx": { + id: "identity-basics/index.mdx", + slug: "identity-basics", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"identity-basics/magic-links.md": { + id: "identity-basics/magic-links.md", + slug: "identity-basics/magic-links", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"identity-basics/multi-tenancy-vs-single-tenant-idaas-solutions.md": { + id: "identity-basics/multi-tenancy-vs-single-tenant-idaas-solutions.md", + slug: "identity-basics/multi-tenancy-vs-single-tenant-idaas-solutions", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"identity-basics/open-source-vs-commercial.md": { + id: "identity-basics/open-source-vs-commercial.md", + slug: "identity-basics/open-source-vs-commercial", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"identity-basics/outsource-auth-system-blueprint.md": { + id: "identity-basics/outsource-auth-system-blueprint.md", + slug: "identity-basics/outsource-auth-system-blueprint", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"identity-basics/registration-best-practices.md": { + id: "identity-basics/registration-best-practices.md", + slug: "identity-basics/registration-best-practices", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"identity-basics/slow-migration.mdx": { + id: "identity-basics/slow-migration.mdx", + slug: "identity-basics/slow-migration", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"identity-basics/try-before-you-buy.md": { + id: "identity-basics/try-before-you-buy.md", + slug: "identity-basics/try-before-you-buy", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"identity-basics/what-is-identity-proofing.md": { + id: "identity-basics/what-is-identity-proofing.md", + slug: "identity-basics/what-is-identity-proofing", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"identity-basics/what-is-scim.mdx": { + id: "identity-basics/what-is-scim.mdx", + slug: "identity-basics/what-is-scim", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"identity-basics/what-to-do-when-auth-system-vendor-acquired.md": { + id: "identity-basics/what-to-do-when-auth-system-vendor-acquired.md", + slug: "identity-basics/what-to-do-when-auth-system-vendor-acquired", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"login-authentication-workflows/authentication-workflows-overview.md": { + id: "login-authentication-workflows/authentication-workflows-overview.md", + slug: "login-authentication-workflows/authentication-workflows-overview", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"login-authentication-workflows/index.mdx": { + id: "login-authentication-workflows/index.mdx", + slug: "login-authentication-workflows", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/mobile/native-login-form-to-application-backend-jwts-refresh-tokens.mdx": { + id: "login-authentication-workflows/mobile/native-login-form-to-application-backend-jwts-refresh-tokens.mdx", + slug: "login-authentication-workflows/mobile/native-login-form-to-application-backend-jwts-refresh-tokens", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/mobile/native-login-form-to-fusionauth-jwts-refresh-tokens.mdx": { + id: "login-authentication-workflows/mobile/native-login-form-to-fusionauth-jwts-refresh-tokens.mdx", + slug: "login-authentication-workflows/mobile/native-login-form-to-fusionauth-jwts-refresh-tokens", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/mobile/oauth-resource-owner-password-credentials-grant-jwts-refresh-tokens.mdx": { + id: "login-authentication-workflows/mobile/oauth-resource-owner-password-credentials-grant-jwts-refresh-tokens.mdx", + slug: "login-authentication-workflows/mobile/oauth-resource-owner-password-credentials-grant-jwts-refresh-tokens", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/native-login-form-to-application-backend-jwts-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/spa/native-login-form-to-application-backend-jwts-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/spa/native-login-form-to-application-backend-jwts-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/native-login-form-to-application-backend-sessions-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/spa/native-login-form-to-application-backend-sessions-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/spa/native-login-form-to-application-backend-sessions-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/native-login-form-to-application-backend-sessions.mdx": { + id: "login-authentication-workflows/spa/native-login-form-to-application-backend-sessions.mdx", + slug: "login-authentication-workflows/spa/native-login-form-to-application-backend-sessions", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/native-login-form-to-fusionauth-jwts-local-storage-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/spa/native-login-form-to-fusionauth-jwts-local-storage-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/spa/native-login-form-to-fusionauth-jwts-local-storage-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/native-login-form-to-fusionauth-jwts-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/spa/native-login-form-to-fusionauth-jwts-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/spa/native-login-form-to-fusionauth-jwts-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/native-login-form-to-fusionauth-same-domain-jwts-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/spa/native-login-form-to-fusionauth-same-domain-jwts-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/spa/native-login-form-to-fusionauth-same-domain-jwts-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/oauth-authorization-code-grant-jwts-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/spa/oauth-authorization-code-grant-jwts-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/spa/oauth-authorization-code-grant-jwts-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/oauth-authorization-code-grant-sessions-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/spa/oauth-authorization-code-grant-sessions-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/spa/oauth-authorization-code-grant-sessions-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/oauth-authorization-code-grant-sessions.mdx": { + id: "login-authentication-workflows/spa/oauth-authorization-code-grant-sessions.mdx", + slug: "login-authentication-workflows/spa/oauth-authorization-code-grant-sessions", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/oauth-implicit-grant-jwts-cookies.mdx": { + id: "login-authentication-workflows/spa/oauth-implicit-grant-jwts-cookies.mdx", + slug: "login-authentication-workflows/spa/oauth-implicit-grant-jwts-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/oauth-implicit-grant-jwts-local-storage.mdx": { + id: "login-authentication-workflows/spa/oauth-implicit-grant-jwts-local-storage.mdx", + slug: "login-authentication-workflows/spa/oauth-implicit-grant-jwts-local-storage", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/oauth-implicit-grant-sessions.mdx": { + id: "login-authentication-workflows/spa/oauth-implicit-grant-sessions.mdx", + slug: "login-authentication-workflows/spa/oauth-implicit-grant-sessions", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/oauth-resource-owner-password-credentials-grant-jwts-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/spa/oauth-resource-owner-password-credentials-grant-jwts-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/spa/oauth-resource-owner-password-credentials-grant-jwts-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/oauth-resource-owner-password-credentials-grant-sessions-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/spa/oauth-resource-owner-password-credentials-grant-sessions-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/spa/oauth-resource-owner-password-credentials-grant-sessions-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/spa/oauth-resource-owner-password-credentials-grant-sessions.mdx": { + id: "login-authentication-workflows/spa/oauth-resource-owner-password-credentials-grant-sessions.mdx", + slug: "login-authentication-workflows/spa/oauth-resource-owner-password-credentials-grant-sessions", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/webapp/native-login-form-to-application-backend-jwts-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/webapp/native-login-form-to-application-backend-jwts-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/webapp/native-login-form-to-application-backend-jwts-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/webapp/native-login-form-to-application-backend-sessions-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/webapp/native-login-form-to-application-backend-sessions-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/webapp/native-login-form-to-application-backend-sessions-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/webapp/native-login-form-to-application-backend-sessions.mdx": { + id: "login-authentication-workflows/webapp/native-login-form-to-application-backend-sessions.mdx", + slug: "login-authentication-workflows/webapp/native-login-form-to-application-backend-sessions", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/webapp/oauth-authorization-code-grant-jwts-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/webapp/oauth-authorization-code-grant-jwts-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/webapp/oauth-authorization-code-grant-jwts-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/webapp/oauth-authorization-code-grant-sessions-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/webapp/oauth-authorization-code-grant-sessions-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/webapp/oauth-authorization-code-grant-sessions-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/webapp/oauth-authorization-code-grant-sessions.mdx": { + id: "login-authentication-workflows/webapp/oauth-authorization-code-grant-sessions.mdx", + slug: "login-authentication-workflows/webapp/oauth-authorization-code-grant-sessions", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/webapp/oauth-resource-owner-password-credentials-grant-jwts-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/webapp/oauth-resource-owner-password-credentials-grant-jwts-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/webapp/oauth-resource-owner-password-credentials-grant-jwts-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/webapp/oauth-resource-owner-password-credentials-grant-sessions-refresh-tokens-cookies.mdx": { + id: "login-authentication-workflows/webapp/oauth-resource-owner-password-credentials-grant-sessions-refresh-tokens-cookies.mdx", + slug: "login-authentication-workflows/webapp/oauth-resource-owner-password-credentials-grant-sessions-refresh-tokens-cookies", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"login-authentication-workflows/webapp/oauth-resource-owner-password-credentials-grant-sessions.mdx": { + id: "login-authentication-workflows/webapp/oauth-resource-owner-password-credentials-grant-sessions.mdx", + slug: "login-authentication-workflows/webapp/oauth-resource-owner-password-credentials-grant-sessions", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"oauth/complete-list-oauth-grants.md": { + id: "oauth/complete-list-oauth-grants.md", + slug: "oauth/complete-list-oauth-grants", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"oauth/differences-between-oauth-2-oauth-2-1.md": { + id: "oauth/differences-between-oauth-2-oauth-2-1.md", + slug: "oauth/differences-between-oauth-2-oauth-2-1", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"oauth/index.mdx": { + id: "oauth/index.mdx", + slug: "oauth", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"oauth/modern-guide-to-oauth.mdx": { + id: "oauth/modern-guide-to-oauth.mdx", + slug: "oauth/modern-guide-to-oauth", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"oauth/oauth-device-authorization.mdx": { + id: "oauth/oauth-device-authorization.mdx", + slug: "oauth/oauth-device-authorization", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"oauth/oauth-token-storage.mdx": { + id: "oauth/oauth-token-storage.mdx", + slug: "oauth/oauth-token-storage", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"oauth/oauth-v1-signed-requests.mdx": { + id: "oauth/oauth-v1-signed-requests.mdx", + slug: "oauth/oauth-v1-signed-requests", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"oauth/saml-vs-oauth.mdx": { + id: "oauth/saml-vs-oauth.mdx", + slug: "oauth/saml-vs-oauth", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"oauth/value-standards-compliant-authentication.md": { + id: "oauth/value-standards-compliant-authentication.md", + slug: "oauth/value-standards-compliant-authentication", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"oauth/why-no-authentication-in-oauth.md": { + id: "oauth/why-no-authentication-in-oauth.md", + slug: "oauth/why-no-authentication-in-oauth", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"security/breached-password-detection.md": { + id: "security/breached-password-detection.md", + slug: "security/breached-password-detection", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"security/guide-to-user-data-security.mdx": { + id: "security/guide-to-user-data-security.mdx", + slug: "security/guide-to-user-data-security", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"security/index.mdx": { + id: "security/index.mdx", + slug: "security", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"security/math-of-password-hashing-algorithms-entropy.md": { + id: "security/math-of-password-hashing-algorithms-entropy.md", + slug: "security/math-of-password-hashing-algorithms-entropy", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"security/password-security-compliance-checklist.mdx": { + id: "security/password-security-compliance-checklist.mdx", + slug: "security/password-security-compliance-checklist", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"security/steps-secure-your-authentication-system.md": { + id: "security/steps-secure-your-authentication-system.md", + slug: "security/steps-secure-your-authentication-system", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"security/zero-trust-identity-provider.md": { + id: "security/zero-trust-identity-provider.md", + slug: "security/zero-trust-identity-provider", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"tokens/building-a-secure-jwt.md": { + id: "tokens/building-a-secure-jwt.md", + slug: "tokens/building-a-secure-jwt", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"tokens/index.mdx": { + id: "tokens/index.mdx", + slug: "tokens", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".mdx"] }, +"tokens/jwt-components-explained.md": { + id: "tokens/jwt-components-explained.md", + slug: "tokens/jwt-components-explained", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"tokens/pros-and-cons-of-jwts.md": { + id: "tokens/pros-and-cons-of-jwts.md", + slug: "tokens/pros-and-cons-of-jwts", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"tokens/revoking-jwts.md": { + id: "tokens/revoking-jwts.md", + slug: "tokens/revoking-jwts", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +"tokens/tokens-microservices-boundaries.md": { + id: "tokens/tokens-microservices-boundaries.md", + slug: "tokens/tokens-microservices-boundaries", + body: string, + collection: "articles", + data: InferEntrySchema<"articles"> +} & { render(): Render[".md"] }, +}, +"blog": { +"10log-fusionauth.mdx": { + id: "10log-fusionauth.mdx", + slug: "10log-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"6-ways-fusionauth-api-gdpr-ready.mdx": { + id: "6-ways-fusionauth-api-gdpr-ready.mdx", + slug: "6-ways-fusionauth-api-gdpr-ready", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"8-things-to-know-about-okta-and-fusionauth.mdx": { + id: "8-things-to-know-about-okta-and-fusionauth.mdx", + slug: "8-things-to-know-about-okta-and-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"aaas-security-due-diligence-excerpt.mdx": { + id: "aaas-security-due-diligence-excerpt.mdx", + slug: "aaas-security-due-diligence-excerpt", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"active-directory-and-fusionauth-ciam-comparison.mdx": { + id: "active-directory-and-fusionauth-ciam-comparison.mdx", + slug: "active-directory-and-fusionauth-ciam-comparison", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"active-directory-connector.mdx": { + id: "active-directory-connector.mdx", + slug: "active-directory-connector", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"adcellerant-migrated-from-mongodb.mdx": { + id: "adcellerant-migrated-from-mongodb.mdx", + slug: "adcellerant-migrated-from-mongodb", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"advanced-registration-form.mdx": { + id: "advanced-registration-form.mdx", + slug: "advanced-registration-form", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"amazon-cognito-and-fusionauth-comparison.mdx": { + id: "amazon-cognito-and-fusionauth-comparison.mdx", + slug: "amazon-cognito-and-fusionauth-comparison", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"angulardenver-fusionauth-sponsor.mdx": { + id: "angulardenver-fusionauth-sponsor.mdx", + slug: "angulardenver-fusionauth-sponsor", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-early-access-program.mdx": { + id: "announcing-early-access-program.mdx", + slug: "announcing-early-access-program", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-16.mdx": { + id: "announcing-fusionauth-1-16.mdx", + slug: "announcing-fusionauth-1-16", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-17.mdx": { + id: "announcing-fusionauth-1-17.mdx", + slug: "announcing-fusionauth-1-17", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-18.mdx": { + id: "announcing-fusionauth-1-18.mdx", + slug: "announcing-fusionauth-1-18", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-19.mdx": { + id: "announcing-fusionauth-1-19.mdx", + slug: "announcing-fusionauth-1-19", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-20.mdx": { + id: "announcing-fusionauth-1-20.mdx", + slug: "announcing-fusionauth-1-20", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-21.mdx": { + id: "announcing-fusionauth-1-21.mdx", + slug: "announcing-fusionauth-1-21", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-22.mdx": { + id: "announcing-fusionauth-1-22.mdx", + slug: "announcing-fusionauth-1-22", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-23.mdx": { + id: "announcing-fusionauth-1-23.mdx", + slug: "announcing-fusionauth-1-23", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-24.mdx": { + id: "announcing-fusionauth-1-24.mdx", + slug: "announcing-fusionauth-1-24", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-25.mdx": { + id: "announcing-fusionauth-1-25.mdx", + slug: "announcing-fusionauth-1-25", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-26.mdx": { + id: "announcing-fusionauth-1-26.mdx", + slug: "announcing-fusionauth-1-26", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-27.mdx": { + id: "announcing-fusionauth-1-27.mdx", + slug: "announcing-fusionauth-1-27", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-28.mdx": { + id: "announcing-fusionauth-1-28.mdx", + slug: "announcing-fusionauth-1-28", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-29.mdx": { + id: "announcing-fusionauth-1-29.mdx", + slug: "announcing-fusionauth-1-29", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-30.mdx": { + id: "announcing-fusionauth-1-30.mdx", + slug: "announcing-fusionauth-1-30", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-31.mdx": { + id: "announcing-fusionauth-1-31.mdx", + slug: "announcing-fusionauth-1-31", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-32.mdx": { + id: "announcing-fusionauth-1-32.mdx", + slug: "announcing-fusionauth-1-32", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-33.mdx": { + id: "announcing-fusionauth-1-33.mdx", + slug: "announcing-fusionauth-1-33", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-34.mdx": { + id: "announcing-fusionauth-1-34.mdx", + slug: "announcing-fusionauth-1-34", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-35.mdx": { + id: "announcing-fusionauth-1-35.mdx", + slug: "announcing-fusionauth-1-35", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-36.mdx": { + id: "announcing-fusionauth-1-36.mdx", + slug: "announcing-fusionauth-1-36", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-37.mdx": { + id: "announcing-fusionauth-1-37.mdx", + slug: "announcing-fusionauth-1-37", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-38.mdx": { + id: "announcing-fusionauth-1-38.mdx", + slug: "announcing-fusionauth-1-38", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-39.mdx": { + id: "announcing-fusionauth-1-39.mdx", + slug: "announcing-fusionauth-1-39", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-40.mdx": { + id: "announcing-fusionauth-1-40.mdx", + slug: "announcing-fusionauth-1-40", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-41.mdx": { + id: "announcing-fusionauth-1-41.mdx", + slug: "announcing-fusionauth-1-41", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-42.mdx": { + id: "announcing-fusionauth-1-42.mdx", + slug: "announcing-fusionauth-1-42", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-43.mdx": { + id: "announcing-fusionauth-1-43.mdx", + slug: "announcing-fusionauth-1-43", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-45.mdx": { + id: "announcing-fusionauth-1-45.mdx", + slug: "announcing-fusionauth-1-45", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-46.mdx": { + id: "announcing-fusionauth-1-46.mdx", + slug: "announcing-fusionauth-1-46", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"announcing-fusionauth-1-47.mdx": { + id: "announcing-fusionauth-1-47.mdx", + slug: "announcing-fusionauth-1-47", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"arm-architecture-support.mdx": { + id: "arm-architecture-support.mdx", + slug: "arm-architecture-support", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"asp-net-core-identity-considered-harmful.mdx": { + id: "asp-net-core-identity-considered-harmful.mdx", + slug: "asp-net-core-identity-considered-harmful", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"auth-and-the-bottleneck-architecture.mdx": { + id: "auth-and-the-bottleneck-architecture.mdx", + slug: "auth-and-the-bottleneck-architecture", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"auth-facade-pattern.mdx": { + id: "auth-facade-pattern.mdx", + slug: "auth-facade-pattern", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"auth0-and-fusionauth-a-tale-of-two-solutions.mdx": { + id: "auth0-and-fusionauth-a-tale-of-two-solutions.mdx", + slug: "auth0-and-fusionauth-a-tale-of-two-solutions", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"authenticators-ceremonies-webauthn-oh-my.mdx": { + id: "authenticators-ceremonies-webauthn-oh-my.mdx", + slug: "authenticators-ceremonies-webauthn-oh-my", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"avoid-lockin-insulate-your-application-and-have-backup-plan-excerpt.mdx": { + id: "avoid-lockin-insulate-your-application-and-have-backup-plan-excerpt.mdx", + slug: "avoid-lockin-insulate-your-application-and-have-backup-plan-excerpt", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"aws-savings-plans.mdx": { + id: "aws-savings-plans.mdx", + slug: "aws-savings-plans", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"become-education-fusionauth.mdx": { + id: "become-education-fusionauth.mdx", + slug: "become-education-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"best-places-to-work.mdx": { + id: "best-places-to-work.mdx", + slug: "best-places-to-work", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"breached-password-detection-best-practices.mdx": { + id: "breached-password-detection-best-practices.mdx", + slug: "breached-password-detection-best-practices", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"breached-password-detection.mdx": { + id: "breached-password-detection.mdx", + slug: "breached-password-detection", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"building-cli-app-with-device-grant-and-golang.mdx": { + id: "building-cli-app-with-device-grant-and-golang.mdx", + slug: "building-cli-app-with-device-grant-and-golang", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"building-fusionauth-homebrew-formula.mdx": { + id: "building-fusionauth-homebrew-formula.mdx", + slug: "building-fusionauth-homebrew-formula", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"building-profile-portal-with-flask-oauth-apis.mdx": { + id: "building-profile-portal-with-flask-oauth-apis.mdx", + slug: "building-profile-portal-with-flask-oauth-apis", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"building-protected-api-with-rails-and-jwt.mdx": { + id: "building-protected-api-with-rails-and-jwt.mdx", + slug: "building-protected-api-with-rails-and-jwt", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"ciam-vs-iam.mdx": { + id: "ciam-vs-iam.mdx", + slug: "ciam-vs-iam", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"circleboom-fusionauth-single-sign-on.mdx": { + id: "circleboom-fusionauth-single-sign-on.mdx", + slug: "circleboom-fusionauth-single-sign-on", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"clearspend-customizes-fusionauth.mdx": { + id: "clearspend-customizes-fusionauth.mdx", + slug: "clearspend-customizes-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"congrats-auth0-okta-acquisition.mdx": { + id: "congrats-auth0-okta-acquisition.mdx", + slug: "congrats-auth0-okta-acquisition", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"consents-example.mdx": { + id: "consents-example.mdx", + slug: "consents-example", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"contaim-fusionauth.mdx": { + id: "contaim-fusionauth.mdx", + slug: "contaim-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"contenda-saved-time-with-fusionauth.mdx": { + id: "contenda-saved-time-with-fusionauth.mdx", + slug: "contenda-saved-time-with-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"critical-infrastructure-latency-gaming.mdx": { + id: "critical-infrastructure-latency-gaming.mdx", + slug: "critical-infrastructure-latency-gaming", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"currentdesk-saved-with-fusionauth.mdx": { + id: "currentdesk-saved-with-fusionauth.mdx", + slug: "currentdesk-saved-with-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"cybanetix-fusionauth-pci-dss.mdx": { + id: "cybanetix-fusionauth-pci-dss.mdx", + slug: "cybanetix-fusionauth-pci-dss", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"data-partners-gdpr-questions-to-ask.mdx": { + id: "data-partners-gdpr-questions-to-ask.mdx", + slug: "data-partners-gdpr-questions-to-ask", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"datastax-switch-fusionauth-case-study.mdx": { + id: "datastax-switch-fusionauth-case-study.mdx", + slug: "datastax-switch-fusionauth-case-study", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"deactivating-reactivating-deleting-user-fusionauth-python.mdx": { + id: "deactivating-reactivating-deleting-user-fusionauth-python.mdx", + slug: "deactivating-reactivating-deleting-user-fusionauth-python", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"dealcloser-saves-developer-time-with-fusionauth.mdx": { + id: "dealcloser-saves-developer-time-with-fusionauth.mdx", + slug: "dealcloser-saves-developer-time-with-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"denver-startup-week-wrapup.mdx": { + id: "denver-startup-week-wrapup.mdx", + slug: "denver-startup-week-wrapup", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"disclosure-conference-report.mdx": { + id: "disclosure-conference-report.mdx", + slug: "disclosure-conference-report", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"django-and-oauth.mdx": { + id: "django-and-oauth.mdx", + slug: "django-and-oauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"dolphinvc-fusionauth.mdx": { + id: "dolphinvc-fusionauth.mdx", + slug: "dolphinvc-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"dot-net-command-line-client.mdx": { + id: "dot-net-command-line-client.mdx", + slug: "dot-net-command-line-client", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"download-counts-from-google-cloud-storage.mdx": { + id: "download-counts-from-google-cloud-storage.mdx", + slug: "download-counts-from-google-cloud-storage", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"download-install-linux-tutorial.mdx": { + id: "download-install-linux-tutorial.mdx", + slug: "download-install-linux-tutorial", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"download-install-mac-tutorial.mdx": { + id: "download-install-mac-tutorial.mdx", + slug: "download-install-mac-tutorial", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"easy-integration-fusionauth-nodejs.mdx": { + id: "easy-integration-fusionauth-nodejs.mdx", + slug: "easy-integration-fusionauth-nodejs", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"easy-integration-of-fusionauth-and-spring.mdx": { + id: "easy-integration-of-fusionauth-and-spring.mdx", + slug: "easy-integration-of-fusionauth-and-spring", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"extending-fusionauth-roles-with-cerbos.mdx": { + id: "extending-fusionauth-roles-with-cerbos.mdx", + slug: "extending-fusionauth-roles-with-cerbos", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"firebase-and-fusionauth-ciam-comparison.mdx": { + id: "firebase-and-fusionauth-ciam-comparison.mdx", + slug: "firebase-and-fusionauth-ciam-comparison", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fitt-finder-fusionauth.mdx": { + id: "fitt-finder-fusionauth.mdx", + slug: "fitt-finder-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-advanced-mfa.mdx": { + id: "fusionauth-advanced-mfa.mdx", + slug: "fusionauth-advanced-mfa", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-and-svb.mdx": { + id: "fusionauth-and-svb.mdx", + slug: "fusionauth-and-svb", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-announces-biotech.mdx": { + id: "fusionauth-announces-biotech.mdx", + slug: "fusionauth-announces-biotech", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-codemash.mdx": { + id: "fusionauth-codemash.mdx", + slug: "fusionauth-codemash", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-colorado-company-to-watch.mdx": { + id: "fusionauth-colorado-company-to-watch.mdx", + slug: "fusionauth-colorado-company-to-watch", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-family-model-consent-management.mdx": { + id: "fusionauth-family-model-consent-management.mdx", + slug: "fusionauth-family-model-consent-management", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-g2-high-performer.mdx": { + id: "fusionauth-g2-high-performer.mdx", + slug: "fusionauth-g2-high-performer", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-inc-5000.mdx": { + id: "fusionauth-inc-5000.mdx", + slug: "fusionauth-inc-5000", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-introduces-pass-wordle.mdx": { + id: "fusionauth-introduces-pass-wordle.mdx", + slug: "fusionauth-introduces-pass-wordle", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-introduces-simplepass.mdx": { + id: "fusionauth-introduces-simplepass.mdx", + slug: "fusionauth-introduces-simplepass", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-lambda-http-connect.mdx": { + id: "fusionauth-lambda-http-connect.mdx", + slug: "fusionauth-lambda-http-connect", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-learning-from-incidents.mdx": { + id: "fusionauth-learning-from-incidents.mdx", + slug: "fusionauth-learning-from-incidents", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-lets-iot-firm-focus-their-app.mdx": { + id: "fusionauth-lets-iot-firm-focus-their-app.mdx", + slug: "fusionauth-lets-iot-firm-focus-their-app", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-loves-open-source.mdx": { + id: "fusionauth-loves-open-source.mdx", + slug: "fusionauth-loves-open-source", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-names-don-bergal-ceo.mdx": { + id: "fusionauth-names-don-bergal-ceo.mdx", + slug: "fusionauth-names-don-bergal-ceo", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-on-digitalocean-marketplace.mdx": { + id: "fusionauth-on-digitalocean-marketplace.mdx", + slug: "fusionauth-on-digitalocean-marketplace", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-passwordless.mdx": { + id: "fusionauth-passwordless.mdx", + slug: "fusionauth-passwordless", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-re-invent-2.mdx": { + id: "fusionauth-re-invent-2.mdx", + slug: "fusionauth-re-invent-2", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-re-invent.mdx": { + id: "fusionauth-re-invent.mdx", + slug: "fusionauth-re-invent", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-recognized-industry-distinctions-comparecamp.mdx": { + id: "fusionauth-recognized-industry-distinctions-comparecamp.mdx", + slug: "fusionauth-recognized-industry-distinctions-comparecamp", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-releases-advanced-threat-detection.mdx": { + id: "fusionauth-releases-advanced-threat-detection.mdx", + slug: "fusionauth-releases-advanced-threat-detection", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-releases-entity-management.mdx": { + id: "fusionauth-releases-entity-management.mdx", + slug: "fusionauth-releases-entity-management", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-reviews-around-world.mdx": { + id: "fusionauth-reviews-around-world.mdx", + slug: "fusionauth-reviews-around-world", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-secures-soc2-type2-certification.mdx": { + id: "fusionauth-secures-soc2-type2-certification.mdx", + slug: "fusionauth-secures-soc2-type2-certification", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-self-service-registration-typescript.mdx": { + id: "fusionauth-self-service-registration-typescript.mdx", + slug: "fusionauth-self-service-registration-typescript", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-soc2-type2-certification.mdx": { + id: "fusionauth-soc2-type2-certification.mdx", + slug: "fusionauth-soc2-type2-certification", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-supports-kubernetes.mdx": { + id: "fusionauth-supports-kubernetes.mdx", + slug: "fusionauth-supports-kubernetes", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-update-saml.mdx": { + id: "fusionauth-update-saml.mdx", + slug: "fusionauth-update-saml", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-vc-free.mdx": { + id: "fusionauth-vc-free.mdx", + slug: "fusionauth-vc-free", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"fusionauth-website-how-we-do-it.mdx": { + id: "fusionauth-website-how-we-do-it.mdx", + slug: "fusionauth-website-how-we-do-it", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"getting-started-with-email-templates.mdx": { + id: "getting-started-with-email-templates.mdx", + slug: "getting-started-with-email-templates", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"gluu-fusionauth-compare-identity-management-solutions.mdx": { + id: "gluu-fusionauth-compare-identity-management-solutions.mdx", + slug: "gluu-fusionauth-compare-identity-management-solutions", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"gnap-next-gen-oauth.mdx": { + id: "gnap-next-gen-oauth.mdx", + slug: "gnap-next-gen-oauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"got-users-100-million.mdx": { + id: "got-users-100-million.mdx", + slug: "got-users-100-million", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"hackfests-fusionauth.mdx": { + id: "hackfests-fusionauth.mdx", + slug: "hackfests-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"hotspot-authentication-with-fusionauth.mdx": { + id: "hotspot-authentication-with-fusionauth.mdx", + slug: "hotspot-authentication-with-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"how-sso-works.mdx": { + id: "how-sso-works.mdx", + slug: "how-sso-works", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"how-to-authenticate-your-react-app.mdx": { + id: "how-to-authenticate-your-react-app.mdx", + slug: "how-to-authenticate-your-react-app", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"how-to-integrate-fusionauth-with-php.mdx": { + id: "how-to-integrate-fusionauth-with-php.mdx", + slug: "how-to-integrate-fusionauth-with-php", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"how-to-migrate-from-azure-ad-b2c.mdx": { + id: "how-to-migrate-from-azure-ad-b2c.mdx", + slug: "how-to-migrate-from-azure-ad-b2c", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"how-to-migrate-from-cognito.mdx": { + id: "how-to-migrate-from-cognito.mdx", + slug: "how-to-migrate-from-cognito", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"how-to-migrate-from-firebase.mdx": { + id: "how-to-migrate-from-firebase.mdx", + slug: "how-to-migrate-from-firebase", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"how-to-migrate-user-data-centralized-auth-system.mdx": { + id: "how-to-migrate-user-data-centralized-auth-system.mdx", + slug: "how-to-migrate-user-data-centralized-auth-system", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"how-to-securely-implement-oauth-angular.mdx": { + id: "how-to-securely-implement-oauth-angular.mdx", + slug: "how-to-securely-implement-oauth-angular", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"how-to-securely-implement-oauth-rails.mdx": { + id: "how-to-securely-implement-oauth-rails.mdx", + slug: "how-to-securely-implement-oauth-rails", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"how-to-set-up-single-sign-on-between-fusionauth-joomla.mdx": { + id: "how-to-set-up-single-sign-on-between-fusionauth-joomla.mdx", + slug: "how-to-set-up-single-sign-on-between-fusionauth-joomla", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"how-to-set-up-single-sign-on-between-fusionauth-wordpress.mdx": { + id: "how-to-set-up-single-sign-on-between-fusionauth-wordpress.mdx", + slug: "how-to-set-up-single-sign-on-between-fusionauth-wordpress", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"iam-product-of-the-year.mdx": { + id: "iam-product-of-the-year.mdx", + slug: "iam-product-of-the-year", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"identiverse-conference-report.mdx": { + id: "identiverse-conference-report.mdx", + slug: "identiverse-conference-report", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"illustrative-mathematics-saved-with-fusionauth.mdx": { + id: "illustrative-mathematics-saved-with-fusionauth.mdx", + slug: "illustrative-mathematics-saved-with-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"implementation-risks-excerpt.mdx": { + id: "implementation-risks-excerpt.mdx", + slug: "implementation-risks-excerpt", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"implementing-fusionauth-python.mdx": { + id: "implementing-fusionauth-python.mdx", + slug: "implementing-fusionauth-python", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"introducing-biometric-authentication.mdx": { + id: "introducing-biometric-authentication.mdx", + slug: "introducing-biometric-authentication", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"introducing-fusionauth-reactor-breached-password-detection.mdx": { + id: "introducing-fusionauth-reactor-breached-password-detection.mdx", + slug: "introducing-fusionauth-reactor-breached-password-detection", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"introducing-unlimited-custom-domains-for-fusionauth-cloud.mdx": { + id: "introducing-unlimited-custom-domains-for-fusionauth-cloud.mdx", + slug: "introducing-unlimited-custom-domains-for-fusionauth-cloud", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"introduction-login-authentication-workflows.mdx": { + id: "introduction-login-authentication-workflows.mdx", + slug: "introduction-login-authentication-workflows", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"inversoft-adds-grolnick-miller-board-directors.mdx": { + id: "inversoft-adds-grolnick-miller-board-directors.mdx", + slug: "inversoft-adds-grolnick-miller-board-directors", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"inversoft-record-results.mdx": { + id: "inversoft-record-results.mdx", + slug: "inversoft-record-results", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"is-fusionauth-gdpr-compliant.mdx": { + id: "is-fusionauth-gdpr-compliant.mdx", + slug: "is-fusionauth-gdpr-compliant", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"jerry-hopper-gdpr-arm-manuals.mdx": { + id: "jerry-hopper-gdpr-arm-manuals.mdx", + slug: "jerry-hopper-gdpr-arm-manuals", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"join-us-boulder-startup-week.mdx": { + id: "join-us-boulder-startup-week.mdx", + slug: "join-us-boulder-startup-week", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"jwt-authorization-microservices-gateway.mdx": { + id: "jwt-authorization-microservices-gateway.mdx", + slug: "jwt-authorization-microservices-gateway", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"keycloak-fusionauth-comparison.mdx": { + id: "keycloak-fusionauth-comparison.mdx", + slug: "keycloak-fusionauth-comparison", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"like-avatar-can-keep.mdx": { + id: "like-avatar-can-keep.mdx", + slug: "like-avatar-can-keep", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"llm-for-fusionauth-documentation.mdx": { + id: "llm-for-fusionauth-documentation.mdx", + slug: "llm-for-fusionauth-documentation", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"locking-an-account-with-breached-password.mdx": { + id: "locking-an-account-with-breached-password.mdx", + slug: "locking-an-account-with-breached-password", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"log4j-fusionauth.mdx": { + id: "log4j-fusionauth.mdx", + slug: "log4j-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"maila-networks-fusionauth-openstack.mdx": { + id: "maila-networks-fusionauth-openstack.mdx", + slug: "maila-networks-fusionauth-openstack", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"manage-custom-user-profile-data.mdx": { + id: "manage-custom-user-profile-data.mdx", + slug: "manage-custom-user-profile-data", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"microservices-gateway.mdx": { + id: "microservices-gateway.mdx", + slug: "microservices-gateway", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"migrate-from-auth0.mdx": { + id: "migrate-from-auth0.mdx", + slug: "migrate-from-auth0", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"migration-types.mdx": { + id: "migration-types.mdx", + slug: "migration-types", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"mitigate-acquisition-risks-auth-vendor-excerpt.mdx": { + id: "mitigate-acquisition-risks-auth-vendor-excerpt.mdx", + slug: "mitigate-acquisition-risks-auth-vendor-excerpt", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"modeling-family-and-consents.mdx": { + id: "modeling-family-and-consents.mdx", + slug: "modeling-family-and-consents", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"multi-tenancy-in-a-single-tenant-architecture.mdx": { + id: "multi-tenancy-in-a-single-tenant-architecture.mdx", + slug: "multi-tenancy-in-a-single-tenant-architecture", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"new-feature-login-theme.mdx": { + id: "new-feature-login-theme.mdx", + slug: "new-feature-login-theme", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"new-feature-social-login-facebook-google-twitter.mdx": { + id: "new-feature-social-login-facebook-google-twitter.mdx", + slug: "new-feature-social-login-facebook-google-twitter", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"nextjs-and-fusionauth-passwordless.mdx": { + id: "nextjs-and-fusionauth-passwordless.mdx", + slug: "nextjs-and-fusionauth-passwordless", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"nextjs-single-sign-on.mdx": { + id: "nextjs-single-sign-on.mdx", + slug: "nextjs-single-sign-on", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"nodejs-and-twitter-oauth.mdx": { + id: "nodejs-and-twitter-oauth.mdx", + slug: "nodejs-and-twitter-oauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"oggeh-fusionauth-gluu.mdx": { + id: "oggeh-fusionauth-gluu.mdx", + slug: "oggeh-fusionauth-gluu", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"omedym-chooses-fusionauth.mdx": { + id: "omedym-chooses-fusionauth.mdx", + slug: "omedym-chooses-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"onelogin-and-fusionauth.mdx": { + id: "onelogin-and-fusionauth.mdx", + slug: "onelogin-and-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"open-office-hours-19-12-17.mdx": { + id: "open-office-hours-19-12-17.mdx", + slug: "open-office-hours-19-12-17", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"open-source-auth-considerations.mdx": { + id: "open-source-auth-considerations.mdx", + slug: "open-source-auth-considerations", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"orbitvu-fusionauth-story.mdx": { + id: "orbitvu-fusionauth-story.mdx", + slug: "orbitvu-fusionauth-story", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"outsourced-auth-team-buy-in.mdx": { + id: "outsourced-auth-team-buy-in.mdx", + slug: "outsourced-auth-team-buy-in", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"partnering-passwordless-decade.mdx": { + id: "partnering-passwordless-decade.mdx", + slug: "partnering-passwordless-decade", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"password-history.mdx": { + id: "password-history.mdx", + slug: "password-history", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"plaintext-passwords.mdx": { + id: "plaintext-passwords.mdx", + slug: "plaintext-passwords", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"powered-by-coffee-fusionauth.mdx": { + id: "powered-by-coffee-fusionauth.mdx", + slug: "powered-by-coffee-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"private-labeling-with-multi-tenant.mdx": { + id: "private-labeling-with-multi-tenant.mdx", + slug: "private-labeling-with-multi-tenant", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"quick-comparison-ping-identity-and-fusionauth.mdx": { + id: "quick-comparison-ping-identity-and-fusionauth.mdx", + slug: "quick-comparison-ping-identity-and-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"rbac-with-kubernetes-fusionauth.mdx": { + id: "rbac-with-kubernetes-fusionauth.mdx", + slug: "rbac-with-kubernetes-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"react-example-application.mdx": { + id: "react-example-application.mdx", + slug: "react-example-application", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"readymag-typescript-apis-support-fusionauth.mdx": { + id: "readymag-typescript-apis-support-fusionauth.mdx", + slug: "readymag-typescript-apis-support-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"reconinfosec-fusionauth.mdx": { + id: "reconinfosec-fusionauth.mdx", + slug: "reconinfosec-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"remix-demo.mdx": { + id: "remix-demo.mdx", + slug: "remix-demo", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"saml-and-oidc-difference.mdx": { + id: "saml-and-oidc-difference.mdx", + slug: "saml-and-oidc-difference", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"scaling-auth-system-excerpt.mdx": { + id: "scaling-auth-system-excerpt.mdx", + slug: "scaling-auth-system-excerpt", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"securely-implement-oauth-in-react.mdx": { + id: "securely-implement-oauth-in-react.mdx", + slug: "securely-implement-oauth-in-react", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"securely-implement-oauth-vuejs.mdx": { + id: "securely-implement-oauth-vuejs.mdx", + slug: "securely-implement-oauth-vuejs", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"securing-a-golang-app-with-oauth.mdx": { + id: "securing-a-golang-app-with-oauth.mdx", + slug: "securing-a-golang-app-with-oauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"securing-asp-netcore-razor-pages-app-with-oauth.mdx": { + id: "securing-asp-netcore-razor-pages-app-with-oauth.mdx", + slug: "securing-asp-netcore-razor-pages-app-with-oauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"securing-flutter-oauth.mdx": { + id: "securing-flutter-oauth.mdx", + slug: "securing-flutter-oauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"securing-golang-microservice.mdx": { + id: "securing-golang-microservice.mdx", + slug: "securing-golang-microservice", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"securing-react-native-with-oauth.mdx": { + id: "securing-react-native-with-oauth.mdx", + slug: "securing-react-native-with-oauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"see-you-at-gdc.mdx": { + id: "see-you-at-gdc.mdx", + slug: "see-you-at-gdc", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"see-you-at-gluecon.mdx": { + id: "see-you-at-gluecon.mdx", + slug: "see-you-at-gluecon", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"see-you-at-kcdc-2023.mdx": { + id: "see-you-at-kcdc-2023.mdx", + slug: "see-you-at-kcdc-2023", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"see-you-at-kcdc.mdx": { + id: "see-you-at-kcdc.mdx", + slug: "see-you-at-kcdc", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"see-you-at-that-conference.mdx": { + id: "see-you-at-that-conference.mdx", + slug: "see-you-at-that-conference", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"seegno-thousands-tenants.mdx": { + id: "seegno-thousands-tenants.mdx", + slug: "seegno-thousands-tenants", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"setting-up-single-sign-on-for-nodebb.mdx": { + id: "setting-up-single-sign-on-for-nodebb.mdx", + slug: "setting-up-single-sign-on-for-nodebb", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"sharing-custom-oauth-claims-with-a-asp-netcore-app.mdx": { + id: "sharing-custom-oauth-claims-with-a-asp-netcore-app.mdx", + slug: "sharing-custom-oauth-claims-with-a-asp-netcore-app", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"single-sign-on-django-fusionauth.mdx": { + id: "single-sign-on-django-fusionauth.mdx", + slug: "single-sign-on-django-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"single-sign-on-laravel-fusionauth.mdx": { + id: "single-sign-on-laravel-fusionauth.mdx", + slug: "single-sign-on-laravel-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"single-sign-on-sso-with-fusionauth.mdx": { + id: "single-sign-on-sso-with-fusionauth.mdx", + slug: "single-sign-on-sso-with-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"single-sign-on-vs-single-log-out.mdx": { + id: "single-sign-on-vs-single-log-out.mdx", + slug: "single-sign-on-vs-single-log-out", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"single-sign-on-with-discord.mdx": { + id: "single-sign-on-with-discord.mdx", + slug: "single-sign-on-with-discord", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"single-sign-on-with-drupal.mdx": { + id: "single-sign-on-with-drupal.mdx", + slug: "single-sign-on-with-drupal", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"single-sign-on-with-shopify.mdx": { + id: "single-sign-on-with-shopify.mdx", + slug: "single-sign-on-with-shopify", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"softozor-fusionauth-hasura-kubernetes.mdx": { + id: "softozor-fusionauth-hasura-kubernetes.mdx", + slug: "softozor-fusionauth-hasura-kubernetes", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"spring-and-fusionauth.mdx": { + id: "spring-and-fusionauth.mdx", + slug: "spring-and-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"spring-fusionauth.mdx": { + id: "spring-fusionauth.mdx", + slug: "spring-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"sunfinity-fusionauth-python.mdx": { + id: "sunfinity-fusionauth-python.mdx", + slug: "sunfinity-fusionauth-python", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"supercharge-development-with-fusionauth.mdx": { + id: "supercharge-development-with-fusionauth.mdx", + slug: "supercharge-development-with-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"switchboard-reduced-migration-time.mdx": { + id: "switchboard-reduced-migration-time.mdx", + slug: "switchboard-reduced-migration-time", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"talent-funnel-fusionauth.mdx": { + id: "talent-funnel-fusionauth.mdx", + slug: "talent-funnel-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"the-value-of-try-before-you-buy-excerpt.mdx": { + id: "the-value-of-try-before-you-buy-excerpt.mdx", + slug: "the-value-of-try-before-you-buy-excerpt", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"theme-registration-form.mdx": { + id: "theme-registration-form.mdx", + slug: "theme-registration-form", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"tips-for-gameday-launches.mdx": { + id: "tips-for-gameday-launches.mdx", + slug: "tips-for-gameday-launches", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"top-forum-posts-apr-2021.mdx": { + id: "top-forum-posts-apr-2021.mdx", + slug: "top-forum-posts-apr-2021", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"top-forum-posts-mar-2021.mdx": { + id: "top-forum-posts-mar-2021.mdx", + slug: "top-forum-posts-mar-2021", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"top-forum-posts-may-2021.mdx": { + id: "top-forum-posts-may-2021.mdx", + slug: "top-forum-posts-may-2021", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"unio-saves-100k-with-fusionauth.mdx": { + id: "unio-saves-100k-with-fusionauth.mdx", + slug: "unio-saves-100k-with-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"unlimited-domains-fusionauth.mdx": { + id: "unlimited-domains-fusionauth.mdx", + slug: "unlimited-domains-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"unsupervised-avoids-development-maintenance-with-with-fusionauth.mdx": { + id: "unsupervised-avoids-development-maintenance-with-with-fusionauth.mdx", + slug: "unsupervised-avoids-development-maintenance-with-with-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"updating-crufty-php-application.mdx": { + id: "updating-crufty-php-application.mdx", + slug: "updating-crufty-php-application", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"user-data-security-is-a-breach.mdx": { + id: "user-data-security-is-a-breach.mdx", + slug: "user-data-security-is-a-breach", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"user-registration-and-sign-in-with-laravel.mdx": { + id: "user-registration-and-sign-in-with-laravel.mdx", + slug: "user-registration-and-sign-in-with-laravel", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"using-fusionauth-with-cockroachdb.mdx": { + id: "using-fusionauth-with-cockroachdb.mdx", + slug: "using-fusionauth-with-cockroachdb", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"using-java-to-manage-fusionauth.mdx": { + id: "using-java-to-manage-fusionauth.mdx", + slug: "using-java-to-manage-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"using-oauth-and-pkce-to-add-authentication-to-your-gatsby-site.mdx": { + id: "using-oauth-and-pkce-to-add-authentication-to-your-gatsby-site.mdx", + slug: "using-oauth-and-pkce-to-add-authentication-to-your-gatsby-site", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"using-the-setup-wizard.mdx": { + id: "using-the-setup-wizard.mdx", + slug: "using-the-setup-wizard", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"using-user-actions.mdx": { + id: "using-user-actions.mdx", + slug: "using-user-actions", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"using-webhooks-to-delete-user-data.mdx": { + id: "using-webhooks-to-delete-user-data.mdx", + slug: "using-webhooks-to-delete-user-data", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"weroad-migrated-from-auth0-to-fusionauth.mdx": { + id: "weroad-migrated-from-auth0-to-fusionauth.mdx", + slug: "weroad-migrated-from-auth0-to-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"what-happens-after-oauth-authentication-event.mdx": { + id: "what-happens-after-oauth-authentication-event.mdx", + slug: "what-happens-after-oauth-authentication-event", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"what-is-scim.mdx": { + id: "what-is-scim.mdx", + slug: "what-is-scim", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"what-is-webauthn-why-do-you-care.mdx": { + id: "what-is-webauthn-why-do-you-care.mdx", + slug: "what-is-webauthn-why-do-you-care", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"whats-new-in-oauth-2-1.mdx": { + id: "whats-new-in-oauth-2-1.mdx", + slug: "whats-new-in-oauth-2-1", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"whats-wrong-with-implicit-grant.mdx": { + id: "whats-wrong-with-implicit-grant.mdx", + slug: "whats-wrong-with-implicit-grant", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"when-to-self-host.mdx": { + id: "when-to-self-host.mdx", + slug: "when-to-self-host", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"why-consider-standards-based-auth-options-excerpt.mdx": { + id: "why-consider-standards-based-auth-options-excerpt.mdx", + slug: "why-consider-standards-based-auth-options-excerpt", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"why-cross-platform-gaming-account.mdx": { + id: "why-cross-platform-gaming-account.mdx", + slug: "why-cross-platform-gaming-account", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"why-device-grant-game-login.mdx": { + id: "why-device-grant-game-login.mdx", + slug: "why-device-grant-game-login", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"why-no-auth-in-oauth.mdx": { + id: "why-no-auth-in-oauth.mdx", + slug: "why-no-auth-in-oauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"why-outsource-auth.mdx": { + id: "why-outsource-auth.mdx", + slug: "why-outsource-auth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"why-secure-gaming-accounts.mdx": { + id: "why-secure-gaming-accounts.mdx", + slug: "why-secure-gaming-accounts", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"why-user-multi-factor-authentication.mdx": { + id: "why-user-multi-factor-authentication.mdx", + slug: "why-user-multi-factor-authentication", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"winning-customer-auth-market.mdx": { + id: "winning-customer-auth-market.mdx", + slug: "winning-customer-auth-market", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"xkit-and-fusionauth.mdx": { + id: "xkit-and-fusionauth.mdx", + slug: "xkit-and-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"zanocloud-helps-companies-with-fusionauth.mdx": { + id: "zanocloud-helps-companies-with-fusionauth.mdx", + slug: "zanocloud-helps-companies-with-fusionauth", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"zendesk-sso-with-hypr.mdx": { + id: "zendesk-sso-with-hypr.mdx", + slug: "zendesk-sso-with-hypr", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +"zero-trust-idps.mdx": { + id: "zero-trust-idps.mdx", + slug: "zero-trust-idps", + body: string, + collection: "blog", + data: any +} & { render(): Render[".mdx"] }, +}, +"dev-tools": { +"base64-encoder-decoder.mdx": { + id: "base64-encoder-decoder.mdx", + slug: "base64-encoder-decoder", + body: string, + collection: "dev-tools", + data: InferEntrySchema<"dev-tools"> +} & { render(): Render[".mdx"] }, +"date-time.mdx": { + id: "date-time.mdx", + slug: "date-time", + body: string, + collection: "dev-tools", + data: InferEntrySchema<"dev-tools"> +} & { render(): Render[".mdx"] }, +"index.mdx": { + id: "index.mdx", + slug: "index", + body: string, + collection: "dev-tools", + data: InferEntrySchema<"dev-tools"> +} & { render(): Render[".mdx"] }, +"jwt-decoder.mdx": { + id: "jwt-decoder.mdx", + slug: "jwt-decoder", + body: string, + collection: "dev-tools", + data: InferEntrySchema<"dev-tools"> +} & { render(): Render[".mdx"] }, +"url-encoder-decoder.mdx": { + id: "url-encoder-decoder.mdx", + slug: "url-encoder-decoder", + body: string, + collection: "dev-tools", + data: InferEntrySchema<"dev-tools"> +} & { render(): Render[".mdx"] }, +"uuid-generator.mdx": { + id: "uuid-generator.mdx", + slug: "uuid-generator", + body: string, + collection: "dev-tools", + data: InferEntrySchema<"dev-tools"> +} & { render(): Render[".mdx"] }, +}, +"quickstarts": { +"quickstart-dotnet-web.mdx": { + id: "quickstart-dotnet-web.mdx", + slug: "quickstart-dotnet-web", + body: string, + collection: "quickstarts", + data: InferEntrySchema<"quickstarts"> +} & { render(): Render[".mdx"] }, +"quickstart-golang-web.mdx": { + id: "quickstart-golang-web.mdx", + slug: "quickstart-golang-web", + body: string, + collection: "quickstarts", + data: InferEntrySchema<"quickstarts"> +} & { render(): Render[".mdx"] }, +"quickstart-python-django-web.mdx": { + id: "quickstart-python-django-web.mdx", + slug: "quickstart-python-django-web", + body: string, + collection: "quickstarts", + data: InferEntrySchema<"quickstarts"> +} & { render(): Render[".mdx"] }, +"quickstart-python-flask-web.mdx": { + id: "quickstart-python-flask-web.mdx", + slug: "quickstart-python-flask-web", + body: string, + collection: "quickstarts", + data: InferEntrySchema<"quickstarts"> +} & { render(): Render[".mdx"] }, +"quickstart-ruby-rails-web.mdx": { + id: "quickstart-ruby-rails-web.mdx", + slug: "quickstart-ruby-rails-web", + body: string, + collection: "quickstarts", + data: InferEntrySchema<"quickstarts"> +} & { render(): Render[".mdx"] }, +"quickstart-springboot-api.mdx": { + id: "quickstart-springboot-api.mdx", + slug: "quickstart-springboot-api", + body: string, + collection: "quickstarts", + data: InferEntrySchema<"quickstarts"> +} & { render(): Render[".mdx"] }, +"quickstart-springboot-web.mdx": { + id: "quickstart-springboot-web.mdx", + slug: "quickstart-springboot-web", + body: string, + collection: "quickstarts", + data: InferEntrySchema<"quickstarts"> +} & { render(): Render[".mdx"] }, +}, + + }; + + type ContentConfig = typeof import("../src/content/config.js"); +} diff --git a/astro/src/content/quickstarts/quickstart-dotnet-web.mdx b/astro/src/content/quickstarts/quickstart-dotnet-web.mdx new file mode 100644 index 0000000000..f8cfca41ac --- /dev/null +++ b/astro/src/content/quickstarts/quickstart-dotnet-web.mdx @@ -0,0 +1,345 @@ +--- +title: .NET +description: Quickstart integration of .NET web application with FusionAuth +navcategory: getting-started +prerequisites: .NET, Docker +section: web +technology: .NET 7 +language: c#, +icon: /img/icons/dotnet-c.svg +faIcon: fa-gem +color: rose +cta: EmailListCTA +coderoot: https://raw.githubusercontent.com/FusionAuth/fusionauth-quickstart-dotnet-web/main +--- +import Aside from '../../components/Aside.astro'; +import LoginAfter from '../../diagrams/quickstarts/login-after.astro'; +import LoginBefore from '../../diagrams/quickstarts/login-before.astro'; +import RemoteCode from '../../components/RemoteCode.astro'; + +In this quickstart you are going to build an application with C# and .NET and integrate it with FusionAuth. +You'll be building it for [ChangeBank](https://www.youtube.com/watch?v=CXDxNCzUspM), a global leader in converting dollars into coins. +It'll have areas reserved for users who have logged in as well as public facing sections. + +The docker compose file and source code for a complete application are available on github under [fusionauth-quickstart-dotnet-web](https://github.com/FusionAuth/fusionauth-quickstart-dotnet-web) project. + +## Prerequisites + +- [.NET](https://dotnet.microsoft.com/en-us/download): This is the framework needed to run .NET applications. This app has been tested with .NET 7.0.7. This example should work with future compatible versions of .NET. +- [Docker](https://www.docker.com): The quickest way to stand up FusionAuth. (There are [other ways](/docs/v1/tech/installation-guide/)). +- [Visual Studio Code](https://code.visualstudio.com/download): The editor for making changes to code. (You can use other editors as well.) + +## General Architecture + +While this sample application doesn't have login functionality without FusionAuth, a more typical integration will replace an existing login system with FusionAuth. + +In that case, the system might look like this before FusionAuth is introduced. + + + +The login flow will look like this after FusionAuth is introduced. + + + +In general, you are introducing FusionAuth in order to normalize and consolidate user data. This helps make sure it is consistent and up-to-date as well as offloading your login security and functionality to FusionAuth. + +## Getting Started + +In this section, you'll get FusionAuth up and running and use .NET to create a new application. + +### Clone the Code + +First off, grab the code from the repository and change into that directory. + +``` +git clone https://github.com/FusionAuth/fusionauth-quickstart-dotnet-web.git +cd fusionauth-quickstart-dotnet-web +``` + +### Run FusionAuth via Docker + +In the root directory of the repo you'll find a Docker compose file (docker-compose.yml) and an environment variables configuration file (.env). Assuming you have Docker installed on your machine, you can stand up FusionAuth up on your machine with: + +``` +docker compose up -d +``` + +Here you are using a bootstrapping feature of FusionAuth, called [Kickstart](docs/v1/tech/installation-guide/kickstart). When FusionAuth comes up for the first time, it will look at the `kickstart/kickstart.json` file and configure FusionAuth to a certain initial state. + + + +FusionAuth will be initially configured with these settings: + +* Your client Id is `e9fdb985-9173-4e01-9d73-ac2d60d1dc8e`. +* Your client secret is `super-secret-secret-that-should-be-regenerated-for-production`. +* Your example username is `richard@example.com` and the password is `password`. +* Your admin username is `admin@example.com` and the password is `password`. +* The base URL of FusionAuth `http://localhost:9011/`. + +You can log into the [FusionAuth admin UI](http://localhost:9011/admin) and look around if you want, but with Docker/Kickstart you don't need to. + +### Create your .NET 7 Application + +Now you are going to create a .NET application using C#. While this section builds a simple .NET web application, you can use the same configuration to integrate your existing .NET application with FusionAuth. + +You'll use [Razor Pages](https://learn.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-7.0&tabs=visual-studio) and .NET 7. This application will display common information to all users. There will also be a secured area, only available to an authenticated user. The [full source code](https://github.com/FusionAuth/fusionauth-quickstart-dotnet-web) is available if you want to download it and take a look. + + + +To get started building your own application, open your command-line shell (i.e. Terminal on a Mac or Powershell on Windows) and navigate to the directory of your choice. Then create a new web application using the `dotnet` CLI and go to that directory: + +```shell +dotnet new webapp -o your-application +cd your-application +``` + + + +Once the application has been created, you can start up the web application using the following command in. + +```shell +dotnet run +``` + +The output should look similar to the following. + +```shell +Building... +info: Microsoft.Hosting.Lifetime[14] + Now listening on: http://localhost:5146 +info: Microsoft.Hosting.Lifetime[0] + Application started. Press Ctrl+C to shut down. +info: Microsoft.Hosting.Lifetime[0] + Hosting environment: Development +info: Microsoft.Hosting.Lifetime[0] + Content root path: /Users/Shared/your-application +``` + +The application will be accessible in your browser at `http://localhost:{PortNumber}` where the port number will be displayed in your shell window, i.e `http://localhost:5146`. + +Press Control+C in the terminal window to stop the application from running. + +## Authentication + +It's always smart to leverage existing libraries as they are likely to be more secure and better handle edge cases. You're going to add an `OpenIdConnect` library to the application. In your terminal window, make sure you're in the root directory for your application and run the command below to add the library. + +```shell +dotnet add package Microsoft.AspNetCore.Authentication.OpenIdConnect +``` + +This application will contain two pages that require authorization. The `Account` page will display the user's balance and the `MakeChange` page will make change for the user. To protect these pages you can use the [Authorize filter attribute](https://docs.microsoft.com/en-us/aspnet/core/razor-pages/filter?view=aspnetcore-3.1#authorize-filter-attribute) in the [page model](https://learn.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-7.0&tabs=visual-studio). + +Create `Account.cshtml` and `Account.cshtml.cs` in the `Pages` directory. To protect the "Account" page you can use the [Authorize filter attribute](https://learn.microsoft.com/en-us/aspnet/core/razor-pages/filter?view=aspnetcore-7.0#authorize-filter-attribute) in the [page model](https://learn.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-7.0&tabs=visual-studio). + +Copy the following code into `Account.cshtml.cs`: + + + +Copy the following code into `Account.cshtml`: + + + +Create `MakeChange.cshtml` and `MakeChange.cshtml.cs` in the `Pages` directory. You will use the same [Authorize filter attribute](https://docs.microsoft.com/en-us/aspnet/core/razor-pages/filter?view=aspnetcore-3.1#authorize-filter-attribute) to secure the page. + +Copy the following code into `MakeChange.cshtml.cs`: + + + +Copy the following code into `MakeChange.cshtml`: + + + +You will need a way to allow the user to logout of the application as well. You'll build the logout functionality in the `Logout` page. This will: + +- Remove the session cookie. +- Redirect to the FusionAuth OAuth logout endpoint. + +FusionAuth will then destroy its session and redirect the user back to the app's configured logout URL. + +Add the following file to the `Pages` directory and call it `Logout.cshtml.cs`: + + + +`OnGet` is the important method. Here you sign out using a method of the authentication library, delete the JWT cookie, and send the user to the FusionAuth OAuth logout endpoint. + +Now add `Logout.cshtml` to the `Pages` directory. No content is necessary. Just declare the page and model as shown below. + + + +### Application Configuration +You will need to do a little plumbing to ensure things like having the correct settings and configuring the cookies properly to work over http for the sample application. + +#### App Settings +Replace the text in the `appsettings.json` file with the text below. The important part here is that we are adding the `FusionAuthSettings` section so that the code above will run with the correct configuration settings. `Authority` is just the location of the user identity server, in this case, FusionAuth. `Urls` ensures the application runs on the specified port, 5000. + + + +#### Program Settings +Replace the text in the `Program.cs` file. Since you are using unsecured cookies, you need to allow this in the configuration. Safari and Chrome require different settings and that is reflected in the code below. + + + +#### Startup Settings +Add the `Startup.cs` file in the root directory of the application. This sets the correct port and manages unsecured cookies for the browsers. The `CheckSameSite` and `DisallowsSameSiteNone` functions help manage the cookie settings for the different browsers. + + + + + +#### Navigation +This application will display different menu items for authenticated users and non authenticated users. To add this type of navigation update `/Pages/Shared/_Layout.cshtml` with the following: + + + +#### Homepage +Update the default page. + +Copy the following code into `Pages/Index.cshtml.cs`: + + + +Copy the following code into `Index.cshtml` and notice the logic to show a different view to users that have not logged in. + + + +#### Styling +To give the pages the look and feel of an application, apply the following styling and images. + +Add the `changebank.css` file in the `wwwroot/css` directory of the application. + + + +Copy the money image for the `Index` page. Run the following command in a terminal window. Make sure you are in the root directory for your application. + +```shell +curl --create-dirs --output wwwroot/img/money.jpg https://raw.githubusercontent.com/FusionAuth/fusionauth-quickstart-ruby-on-rails-web/main/complete-app/app/assets/images/money.jpg +``` + +#### A Little Clean Up +Next we need to do a little clean up and make sure all the namespaces work together in the application. + +Replace the text in the `Pages/_ViewImports.cshtml` file with the following code. + + + +Replace the text in the `Pages/Error.cshtml.cs` file with the following code. + + + +Replace the text in the `Pages/Privacy.cshtml.cs` file with the following code. + + + +## Run The Application + +You can start up the {frontmatter.technology} application using this command in a terminal window from the root directory of your application: + +```shell +dotnet run +``` + +You can now open up an incognito window and visit the app at http://localhost:5000. Log in with the user account you created when setting up FusionAuth, and you’ll see the email of the user next to a logout button. + +## Next Steps +This quickstart is a great way to get a proof of concept up and running quickly, but to run +your application in production, there are some things you're going to want to do. + +### FusionAuth Customization +FusionAuth gives you the ability to customize just about everything with the user's experience and your application's integration. This includes +* [Hosted pages](/docs/v1/tech/themes/) such as login, registration, email verification, and many more +* [Email templates](/docs/v1/tech/email-templates/email-templates) +* [User data and custom claims in access token JWTs](/articles/tokens/jwt-components-explained) + +### Security +* [Microsoft.AspNetCore.Authentication.OpenIDConnect](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.OpenIdConnect) ASP.NET Core middleware that enables an application to support the OpenID Connect authentication workflow +* You may want to customize the [token expiration times and policies](/docs/v1/tech/oauth/#configure-application-oauth-settings) in FusionAuth +* Choose [password rules](/docs/v1/tech/core-concepts/tenants#password) and a [hashing algorithm](/docs/v1/tech/reference/password-hashes) that meet your security needs + +### Tenant and Application Management +* Model your application topology using [Applications](/docs/v1/tech/core-concepts/applications), [Roles](/docs/v1/tech/core-concepts/roles), [Groups](docs/v1/tech/core-concepts/groups), [Entities](/docs/v1/tech/core-concepts/groups), and more +* Set up [MFA](docs/v1/tech/guides/multi-factor-authentication), [Social login](/docs/v1/tech/identity-providers/), and/or [SAML](/docs/v1/tech/identity-providers/samlv2/) integrations +* Integrate with external systems using [Webhooks](/docs/v1/tech/events-webhooks/), [SCIM](/docs/v1/tech/core-concepts/scim), and [Lambdas](docs/v1/tech/lambdas/) + +## Troubleshooting + +If you run into an issue with cookies on Safari or other browsers, you might need to run the .NET application under SSL. + +You can follow [this guide](https://learn.microsoft.com/en-us/dotnet/core/additional-tools/self-signed-certificates-guide) to install development SSL certificates for your .NET environment. + +Alternatively, you can run the project using [Visual Studio](https://visualstudio.microsoft.com), which will run the project using SSL. + +If you do this, make sure to update the `Authorized Redirect URL` to reflect the `https` protocol. Also note that the project will probably run on a different port when using SSL, so you must update that as well. To do so, log into the administrative user interface, navigate to `Applications`, then click the `Edit` button on your application and navigate to the `OAuth` tab. You can have more than one URL. + +If you change the name of the application from 'your-application' to some other name, you will need to make sure the correct namespace is used in all of your code. + +There are [multiple ways of deploying an application](https://docs.microsoft.com/en-us/dotnet/core/deploying/), but publishing ensures your deployment process is repeatable. You can use the [RID catalog](https://learn.microsoft.com/en-us/dotnet/core/rid-catalog) to build different versions of this application for different platforms. + +If you have trouble running the application, please verify all the files are updated as instructed. The directory for the `your-application` tree should look like this: + +```text +└── your-application + ├── appsettings.Development.json + ├── appsettings.json + ├── bin/ + ├── ... + ├── obj/ + ├── ... + ├── Pages/ + │ ├── _ViewImports.cshtml + │ ├── _ViewStart.cshtml + | |── Account.cshtml + | |── Accuont.cshtml.cs + │ ├── Error.cshtml + │ ├── Error.cshtml.cs + │ ├── Index.cshtml + │ ├── Index.cshtml.cs + │ ├── Logout.cshtml + │ ├── Logout.cshtml.cs + | |── MakeChange.cshtml + | |── MakeChange.cshtml.cs + │ ├── Privacy.cshtml + │ ├── Privacy.cshtml.cs + │ └── Shared/ + │ ├── _Layout.cshtml + │ ├── _Layout.cshtml.css + │ └── _ValidateScriptsPartial.cshtml + ├── Program.cs + ├── Properties/ + ├── ... + ├── Startup.cs + └── wwwroot/ + ├── ... +``` + +The full code is available [here](https://github.com/FusionAuth/fusionauth-quickstart-dotnet-web). \ No newline at end of file diff --git a/astro/src/pages/docs/quickstarts/quickstart-sections.ts b/astro/src/pages/docs/quickstarts/quickstart-sections.ts index 775c49b407..e3ebb30546 100644 --- a/astro/src/pages/docs/quickstarts/quickstart-sections.ts +++ b/astro/src/pages/docs/quickstarts/quickstart-sections.ts @@ -58,13 +58,6 @@ const qsSections: QuickStartSection[] = [ faIcon: 'fa-w', navColor: 'fuchsia', }, - { - href: '/docs/v1/tech/tutorials/integrate-dotnet', - title: '.NET', - icon: '/img/icons/dotnet-c.svg', - faIcon: 'fa-hashtag', - navColor: 'blue' - }, { href: '/blog/2023/04/26/nextjs-single-sign-on', title: '.Next.js', diff --git a/site/_data/exampleapps.yaml b/site/_data/exampleapps.yaml index 3a2634f1f6..823429ded0 100644 --- a/site/_data/exampleapps.yaml +++ b/site/_data/exampleapps.yaml @@ -111,7 +111,7 @@ name: C# API access description: Protecting a C# API with a JWT language: netcore -- url: https://github.com/fusionauth/fusionauth-example-dotnet-guide +- url: https://github.com/fusionauth/fusionauth-quickstart-dotnet-web name: .NET 7 OIDC description: .NET core integration with OIDC using the OpenID Connect library language: netcore diff --git a/site/assets/img/docs/integrations/dotnet-integration/dotnet-login-page.png b/site/assets/img/docs/integrations/dotnet-integration/dotnet-login-page.png deleted file mode 100644 index c9f21742f7..0000000000 Binary files a/site/assets/img/docs/integrations/dotnet-integration/dotnet-login-page.png and /dev/null differ diff --git a/site/assets/img/docs/integrations/dotnet-integration/dotnet-secure-page-claims.png b/site/assets/img/docs/integrations/dotnet-integration/dotnet-secure-page-claims.png deleted file mode 100644 index da99c2040f..0000000000 Binary files a/site/assets/img/docs/integrations/dotnet-integration/dotnet-secure-page-claims.png and /dev/null differ diff --git a/site/assets/img/docs/integrations/dotnet-integration/dotnet-welcome-page.png b/site/assets/img/docs/integrations/dotnet-integration/dotnet-welcome-page.png deleted file mode 100644 index a3c8cff808..0000000000 Binary files a/site/assets/img/docs/integrations/dotnet-integration/dotnet-welcome-page.png and /dev/null differ diff --git a/site/docs/v1/tech/tutorials/integrate-dotnet.md b/site/docs/v1/tech/tutorials/integrate-dotnet.md deleted file mode 100644 index d7a85e7f4c..0000000000 --- a/site/docs/v1/tech/tutorials/integrate-dotnet.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -layout: doc -title: Integrate Your C# .NET Application With FusionAuth -description: Integrate your C# .NET application with FusionAuth -navcategory: getting-started -prerequisites: C# and dotnet -technology: .NET 7 -language: C# ---- - -## Integrate Your {{page.technology}} Application With FusionAuth - -{% include docs/integration/_intro.md %} - -## Prerequisites - -{% include docs/integration/_prerequisites.md %} - -Although this guide shows how to build the {{page.technology}} application using command line tools, you can also use [Visual Studio](https://visualstudio.microsoft.com) to build the project. - -## Download and Install FusionAuth - -{% include docs/integration/_install-fusionauth.md %} - -## Create a User and an API Key - -{% include docs/integration/_add-user.md %} - -## Configure FusionAuth - -Next, you need to set up FusionAuth. This can be done in different ways, but you're going to use the {{page.language}} client library. The below instructions use `dotnet` from the command line, but you can use the client library with an IDE of your choice as well. - -First, create a {{page.technology}} project in a new directory: - -```shell -dotnet new console --output SetupFusionauth && cd SetupFusionauth -``` - -Now, copy and paste the following code into `Program.cs`. - -```csharp -{% remote_include https://raw.githubusercontent.com/FusionAuth/fusionauth-example-client-libraries/main/dotnet/Program.cs %} -``` - -Then, you'll need to import a few NuGet packages: - -```shell -dotnet add package JSON.Net # for debugging -dotnet add package FusionAuth.Client # for client access -``` - -You can then publish and run the application. Replace `` with the API key that you generated. - -{% include _callout-note.liquid content="The setup script is designed to run on a newly installed FusionAuth instance with only one user and no tenants other than `Default`. To follow this guide on a FusionAuth instance that does not meet these criteria, you may need to modify the above script.

Refer to the [.NET Core client library](/docs/v1/tech/client-libraries/netcore) documentation for more information.

The path to the SetupFusionauth executable will be different depending on your platform." %} - - - -```shell -dotnet publish -r osx-x64 -fusionauth_api_key= bin/Debug/net7.0/osx-x64/publish/SetupFusionauth -``` - -If you are using PowerShell, you will need to set the environment variable in a separate command before executing the application. - -```shell -$env:fusionauth_api_key='' -bin\Debug\net7.0\win-x64\publish\SetupFusionauth.exe -``` - -If you want, you can [login to your instance](http://localhost:9011) and examine the new application configuration the script created for you. - -## Create Your {{page.technology}} Application - -Now you are going to create a {{page.technology}} application. While this section uses a simple {{page.technology}} application, you can use the same configuration to integrate your {{page.technology}} application with FusionAuth. - -You'll use [Razor Pages](https://learn.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-7.0&tabs=visual-studio) and {{page.technology}}. This application will display common information to all users. There will also be a secured area, only available to an authenticated user. The [full source code](https://github.com/fusionauth/fusionauth-example-dotnet-guide) is available if you want to download it and take a look. - -First, create a new web application using the `dotnet` CLI and go to that directory: - -```shell -dotnet new webapp -o SetupDotnet && cd SetupDotnet -``` - -To see the results, you should publish this application and run it. There are [multiple ways of deploying an application](https://docs.microsoft.com/en-us/dotnet/core/deploying/), but publishing ensures your deployment process is repeatable. You can use the [RID catalog](https://learn.microsoft.com/en-us/dotnet/core/rid-catalog) to build different versions of this application for different platforms. Here's the command to publish a standalone executable you could deploy behind a proxy like Nginx: - -```shell -dotnet publish -r osx-x64 -``` - -Then start up the executable. - -```shell -bin/Debug/net7.0/osx-x64/publish/SetupDotnet -``` - -The application will be accessible at `http://localhost:5000`. - -{% include docs/_image.liquid src="/assets/img/docs/integrations/dotnet-integration/dotnet-welcome-page.png" alt="Home page for .Net app" class="img-fluid bottom-cropped" width="1200" figure=false %} - -You can hit `control-C` to exit this application. - -## Handle login for your {{page.technology}} application - -It's always smart to leverage existing libraries as they are likely to be more secure and better handle edge cases. You're going to add an `OpenIdConnect` library to the application. Make sure you're in the `SetupDotnet` directory and run the command below to add the library. - -```shell -dotnet add package Microsoft.AspNetCore.Authentication.OpenIdConnect -``` - -> The script set up a `RS256` asymmetric signing key. FusionAuth supports this signing algorithm, but doesn't ship with a default key. - -To add a page to be secured, which you can aptly call “Secure”, add `Secure.cshtml` and `Secure.cshtml.cs` to the `SetupDotnet/Pages` directory. To protect the "Secure" page you can use the [Authorize filter attribute](https://docs.microsoft.com/en-us/aspnet/core/razor-pages/filter?view=aspnetcore-3.1#authorize-filter-attribute) on the backing class, from `Secure.cshtml.cs`. - -Copy the following code into `Secure.cshtml.cs`: - -```csharp -{% remote_include https://raw.githubusercontent.com/FusionAuth/fusionauth-example-dotnet-guide/main/SetupDotnet/Pages/Secure.cshtml.cs %} -``` - -You'll also display the claims contained in the JWT that FusionAuth creates upon authentication. A claim is essentially the information the authentication server has shared about a subject in the JWT. Here `Secure.cshtml` iterates over the claims. Update that file with the following code. - -```html -{% remote_include https://raw.githubusercontent.com/FusionAuth/fusionauth-example-dotnet-guide/main/SetupDotnet/Pages/Secure.cshtml %} -``` - -To add a navigation element to navigate to the secure page update `Pages/Shared/_Layout.cshtml` with the following: - -```html -{% remote_include https://raw.githubusercontent.com/FusionAuth/fusionauth-example-dotnet-guide/main/SetupDotnet/Pages/Shared/_Layout.cshtml %} -``` - -You also need to set up some services to specify how this page is protected. Create a `Startup.cs` file in the root directory of the `SetupDotnet` project and add the following code: - -```csharp -{% remote_include https://raw.githubusercontent.com/FusionAuth/fusionauth-example-dotnet-guide/main/SetupDotnet/Startup.cs %} -``` - -Replace the code in the `Program.cs` file with the following: - -```csharp -{% remote_include https://raw.githubusercontent.com/FusionAuth/fusionauth-example-dotnet-guide/main/SetupDotnet/Program.cs %} -``` - -Currently, the app lets you log in but there's no way to log out. Next, you'll build the logout functionality and page. This will: - -- Remove the session cookie. -- Redirect to the FusionAuth OAuth logout endpoint. - -FusionAuth will then destroy its session and redirect the user back to the app's configured logout URL. - -Add the following file to the `Pages` directory and call it `Logout.cshtml.cs`: - -```csharp -{% remote_include https://raw.githubusercontent.com/FusionAuth/fusionauth-example-dotnet-guide/main/SetupDotnet/Pages/Logout.cshtml.cs %} -``` - -`OnGet` is the important method. Here you sign out using a method of the authentication library, delete the JWT cookie, and send the user to the FusionAuth OAuth logout endpoint. - -Now add `Logout.cshtml` to the `Pages` directory. No content is necessary. Just declare the page and model as shown below. - -```html -{% remote_include https://raw.githubusercontent.com/FusionAuth/fusionauth-example-dotnet-guide/main/SetupDotnet/Pages/Logout.cshtml %} -``` - -Update the `appsettings.json` file. You need to add the entire SetupDotnet{:.field} object so that the code above can be configured correctly. Authority{:.field} is just the location of the user identity server, in this case, FusionAuth. - -```json -{% remote_include https://raw.githubusercontent.com/FusionAuth/fusionauth-example-dotnet-guide/main/SetupDotnet/appsettings.json %} -``` - -Wait, where's the client secret? This file is in Git, but you should not put secrets under version control. Instead, the client secret is provided on the command line via an environment variable. This change means the correct way to publish and start the web application is now as shown below (where you replace `` with the client secret value, which for this example is `change-this-in-production-to-be-a-real-secret`): - -```shell -dotnet publish -r osx-x64 && SetupDotnet__ClientSecret= bin/Debug/net7.0/osx-x64/publish/SetupDotnet -``` - -Once you've updated all these files, you can publish and start the application. You should be able to log in with a previously created user and see the claims. Go to `http://localhost:5000` and click on the Secure{:.uielement} page. You'll be prompted to log in using FusionAuth's default login page. You can [theme the login screen of FusionAuth](/docs/v1/tech/themes/) if you want to make the login page look like your company's brand. - -{% include docs/_image.liquid src="/assets/img/docs/integrations/dotnet-integration/dotnet-login-page.png" alt="FusionAuth login page" class="img-fluid bottom-cropped" width="1200" figure=false %} - -After you've signed in, you'll end up at the "Secure" page and will see all claims encoded in the JWT. - -{% include docs/_image.liquid src="/assets/img/docs/integrations/dotnet-integration/dotnet-secure-page-claims.png" alt="Logged in page with claims" class="img-fluid bottom-cropped" width="1200" figure=false %} - - -## Conclusion - -Your directory tree should look like this: - -```text -├── docker-compose.yml -├── SetupFusionauth -│ ├── Program.cs -│ ├── setup-fusionauth.csproj -│ ├── setup-fusionauth.sln -└── SetupDotnet - ├── appsettings.development.json - ├── appsettings.json - ├── bin/ - ├── ... - ├── obj/ - ├── ... - ├── Pages/ - │ ├── _ViewImports.cshtml - │ ├── _ViewStart.cshtml - │ ├── Error.cshtml - │ ├── Error.cshtml.cs - │ ├── Index.cshtml - │ ├── Index.cshtml.cs - │ ├── Logout.cshtml - │ ├── Logout.cshtml.cs - │ ├── Privacy.cshtml - │ ├── Privacy.cshtml.cs - │ ├── Secure.cshtml - │ └── Secure.cshtml.cs - │ └── Shared/ - │ ├── _Layout.cshtml - │ ├── _Layout.cshtml.css - │ └── _ValidateScriptsPartial.cshtml - ├── Program.cs - ├── Properties/ - ├── SetupDotnet.csproj - ├── SetupDotnet.sln - ├── Startup.cs - └── wwwroot/ -``` - -Once you've created this directory structure, you can start up the {{page.technology}} application using this command: - -```shell -dotnet publish -r osx-x64 && SetupDotnet__ClientSecret='change-this-in-production-to-be-a-real-secret' bin/Debug/net7.0/osx-x64/publish/SetupDotnet -``` - -The full code is available [here](https://github.com/fusionauth/fusionauth-example-dotnet-guide). - -## Troubleshooting - -If you run into an issue with cookies on Safari or other browsers, you might need to run the ASP.NET application under SSL. - -You can follow [this guide](https://learn.microsoft.com/en-us/dotnet/core/additional-tools/self-signed-certificates-guide) to install development SSL certificates for your .NET environment. - -Alternatively, you can run the project using [Visual Studio](https://visualstudio.microsoft.com), which will run the project using SSL. - -If you do this, make sure to update the Authorized Redirect URL{:.field} to reflect the `https` protocol. Also note that the project will probably run on a different port when using SSL, so you must update that as well. To do so, log into the administrative user interface, navigate to Applications{:.breadcrumb}, then click the Edit{:.uielement} button on your application and navigate to the OAuth{:.breadcrumb} tab. You can have more than one URL. - -If you encounter a `SecurityTokenSignatureKeyNotFoundException` error when running the application, you may need to add an RSA key using Key Master{:.breadcrumb} and sign the tokens with that key. More [info here](https://fusionauth.io/community/forum/topic/2419/security-token-signature-key-not-found-exception-idx10501-signature-validation-failed-unable-to-match-key). diff --git a/src/cloudfront/fusionauth-website-request-handler.js b/src/cloudfront/fusionauth-website-request-handler.js index aaddc3554e..a37681fd86 100644 --- a/src/cloudfront/fusionauth-website-request-handler.js +++ b/src/cloudfront/fusionauth-website-request-handler.js @@ -104,6 +104,7 @@ rd[d+'/tutorials/integrate-angular']= '/docs/quickstarts/quickstart-javascript-a rd[d+'/tutorials/integrate-python-django']= '/docs/quickstarts/quickstart-python-django-web'; rd[d+'/tutorials/integrate-python-flask']= '/docs/quickstarts/quickstart-python-flask-web'; rd[d+'/tutorials/integrate-ruby-rails']= '/docs/quickstarts/quickstart-ruby-rails-web'; +rd[d+'/tutorials/integrate-dotnet']= '/docs/quickstarts/quickstart-dotnet-web'; rd[d+'/tutorials/integrate-java-spring']= '/docs/quickstarts/quickstart-springboot-web'; rd[d+'/tutorials/integrate-react']= '/docs/quickstarts/quickstart-javascript-react-web'; rd['/features/architecture']='/platform/built-for-developers';