[{"data":1,"prerenderedAt":480},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started\u002Finstallation":203,"\u002Fgetting-started\u002Finstallation-surround":475},[4,33,96,114,177],{"title":5,"path":6,"stem":7,"children":8,"icon":32},"Get started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12,17,22,27],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Install AuthEndpoints","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-play",{"title":23,"path":24,"stem":25,"icon":26},"Choose a sign-in stack","\u002Fgetting-started\u002Fchoose-a-sign-in-stack","1.getting-started\u002F4.choose-a-sign-in-stack","i-lucide-signpost",{"title":28,"path":29,"stem":30,"icon":31},"Use the AuthEndpoints skill with coding agents","\u002Fgetting-started\u002Fai-agents","1.getting-started\u002F5.ai-agents","i-lucide-bot","i-lucide-rocket",{"title":34,"path":35,"stem":36,"children":37,"icon":95},"Guides","\u002Fguides","2.guides\u002F01.index",[38,40,45,50,55,60,65,70,75,80,85,90],{"title":34,"path":35,"stem":36,"icon":39},"i-lucide-list-checks",{"title":41,"path":42,"stem":43,"icon":44},"Register users","\u002Fguides\u002Fregistration","2.guides\u002F02.registration","i-lucide-user-plus",{"title":46,"path":47,"stem":48,"icon":49},"Sign users in","\u002Fguides\u002Fsign-in","2.guides\u002F03.sign-in","i-lucide-log-in",{"title":51,"path":52,"stem":53,"icon":54},"Sign users out","\u002Fguides\u002Fsign-out","2.guides\u002F04.sign-out","i-lucide-log-out",{"title":56,"path":57,"stem":58,"icon":59},"Turn on two-factor authentication","\u002Fguides\u002Ftwo-factor","2.guides\u002F05.two-factor","i-lucide-smartphone",{"title":61,"path":62,"stem":63,"icon":64},"Reset a forgotten password","\u002Fguides\u002Freset-password","2.guides\u002F06.reset-password","i-lucide-key-round",{"title":66,"path":67,"stem":68,"icon":69},"Change a user's email or password","\u002Fguides\u002Fmanage-account","2.guides\u002F07.manage-account","i-lucide-user-cog",{"title":71,"path":72,"stem":73,"icon":74},"Add, rename, and remove passkeys","\u002Fguides\u002Fmanage-passkeys","2.guides\u002F08.manage-passkeys","i-lucide-scan-face",{"title":76,"path":77,"stem":78,"icon":79},"Link and unlink GitHub or Google accounts","\u002Fguides\u002Flink-external-accounts","2.guides\u002F09.link-external-accounts","i-lucide-link",{"title":81,"path":82,"stem":83,"icon":84},"Require step-up before sensitive actions","\u002Fguides\u002Fstep-up","2.guides\u002F10.step-up","i-lucide-shield-check",{"title":86,"path":87,"stem":88,"icon":89},"Call the API from a browser","\u002Fguides\u002Fbrowser-clients","2.guides\u002F11.browser-clients","i-lucide-globe",{"title":91,"path":92,"stem":93,"icon":94},"Prepare for production","\u002Fguides\u002Fproduction","2.guides\u002F12.production","i-lucide-factory","i-lucide-waypoints",{"title":97,"path":98,"stem":99,"children":100,"icon":113},"Composable endpoints","\u002Fcomposables","3.composables\u002F1.index",[101,104,108],{"title":102,"path":98,"stem":99,"icon":103},"How composition works","i-lucide-layout-grid",{"title":105,"path":106,"stem":107,"icon":39},"Composition requirements","\u002Fcomposables\u002Frequirements","3.composables\u002F2.requirements",{"title":109,"path":110,"stem":111,"icon":112},"Compose a custom auth stack","\u002Fcomposables\u002Frecipes","3.composables\u002F3.recipes","i-lucide-book-marked","i-lucide-blocks",{"title":115,"icon":116,"path":117,"stem":118,"children":119,"page":176},"Reference","i-lucide-book-open","\u002Fmodules","4.modules",[120,125,129,134,139,144,148,153,157,162,166,171],{"title":121,"path":122,"stem":123,"icon":124},"Endpoint reference","\u002Fmodules\u002Fendpoints","4.modules\u002F01.endpoints","i-lucide-route",{"title":126,"path":127,"stem":128,"icon":69},"Identity management module","\u002Fmodules\u002Fidentity-management","4.modules\u002F02.identity-management",{"title":130,"path":131,"stem":132,"icon":133},"Cookie sign-in module","\u002Fmodules\u002Fcookie-auth","4.modules\u002F03.cookie-auth","i-lucide-cookie",{"title":135,"path":136,"stem":137,"icon":138},"Identity bearer sign-in module","\u002Fmodules\u002Fbearer-auth","4.modules\u002F04.bearer-auth","i-lucide-key",{"title":140,"path":141,"stem":142,"icon":143},"JWT module","\u002Fmodules\u002Fjwt","4.modules\u002F05.jwt","i-lucide-fingerprint",{"title":145,"path":146,"stem":147,"icon":74},"Passkeys module","\u002Fmodules\u002Fpasskeys","4.modules\u002F06.passkeys",{"title":149,"path":150,"stem":151,"icon":152},"ReAuth module","\u002Fmodules\u002Freauth","4.modules\u002F07.reauth","i-lucide-shield-alert",{"title":154,"path":155,"stem":156,"icon":49},"External OAuth packages","\u002Fmodules\u002Fexternal-oauth","4.modules\u002F08.external-oauth",{"title":158,"path":159,"stem":160,"icon":161},"Configuration options","\u002Fmodules\u002Fconfiguration","4.modules\u002F09.configuration","i-lucide-settings",{"title":163,"path":164,"stem":165,"icon":84},"Antiforgery (CSRF) rules","\u002Fmodules\u002Fcsrf","4.modules\u002F10.csrf",{"title":167,"path":168,"stem":169,"icon":170},"Responses and errors","\u002Fmodules\u002Ferrors","4.modules\u002F11.errors","i-lucide-circle-alert",{"title":172,"path":173,"stem":174,"icon":175},"Rate-limit policies","\u002Fmodules\u002Frate-limits","4.modules\u002F12.rate-limits","i-lucide-gauge",false,{"title":178,"icon":179,"path":180,"stem":181,"children":182,"page":176},"Concepts","i-lucide-lightbulb","\u002Fconcepts","5.concepts",[183,188,193,198],{"title":184,"path":185,"stem":186,"icon":187},"AuthEndpoints compared with other options","\u002Fconcepts\u002Fcompare","5.concepts\u002F1.compare","i-lucide-git-compare",{"title":189,"path":190,"stem":191,"icon":192},"Stock Identity endpoints vs AuthEndpoints","\u002Fconcepts\u002Fstock-identity-vs-authendpoints","5.concepts\u002F2.stock-identity-vs-authendpoints","i-lucide-columns-2",{"title":194,"path":195,"stem":196,"icon":197},"Security model","\u002Fconcepts\u002Fsecurity-model","5.concepts\u002F3.security-model","i-lucide-shield",{"title":199,"path":200,"stem":201,"icon":202},"FAQ","\u002Fconcepts\u002Ffaq","5.concepts\u002F4.faq","i-lucide-circle-help",{"id":204,"title":13,"body":205,"description":468,"extension":469,"links":470,"meta":471,"navigation":472,"path":14,"seo":473,"stem":15,"__hash__":474},"docs\u002F1.getting-started\u002F2.installation.md",{"type":206,"value":207,"toc":461},"minimark",[208,213,225,254,262,266,320,331,335,342,372,376,386,396,429,435,439,457],[209,210,212],"h2",{"id":211},"nuget-package","NuGet package",[214,215,216],"p",{},[217,218,220],"a",{"href":219},"https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FAuthEndpoints\u002F",[221,222],"img",{"alt":223,"src":224},"nuget","https:\u002F\u002Fimg.shields.io\u002Fnuget\u002Fv\u002FAuthEndpoints?label=AuthEndpoints&logo=NuGet&style=flat-square",[226,227,232],"pre",{"className":228,"code":229,"language":230,"meta":231,"style":231},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dotnet add package AuthEndpoints\n","bash","",[233,234,235],"code",{"__ignoreMap":231},[236,237,240,244,248,251],"span",{"class":238,"line":239},"line",1,[236,241,243],{"class":242},"sBMFI","dotnet",[236,245,247],{"class":246},"sfazB"," add",[236,249,250],{"class":246}," package",[236,252,253],{"class":246}," AuthEndpoints\n",[214,255,256,257,261],{},"The badge shows the latest published version. Release notes are in the ",[217,258,260],{"href":259},"\u002Fchangelog\u002F","changelog",".",[209,263,265],{"id":264},"requirements","Requirements",[267,268,269,282],"table",{},[270,271,272],"thead",{},[273,274,275,279],"tr",{},[276,277,278],"th",{},"Requirement",[276,280,281],{},"Notes",[283,284,285,300,310],"tbody",{},[273,286,287,294],{},[288,289,290],"td",{},[291,292,293],"strong",{},".NET 10",[288,295,296,297],{},"Target framework ",[233,298,299],{},"net10.0",[273,301,302,307],{},[288,303,304],{},[291,305,306],{},"ASP.NET Core Identity",[288,308,309],{},"User store and sign-in",[273,311,312,317],{},[288,313,314],{},[291,315,316],{},"EF Core",[288,318,319],{},"Identity stores and JWT refresh-token table (when JWT is enabled)",[214,321,322,323,326,327,330],{},"Register a ",[233,324,325],{},"DbContext"," that works as the Identity store, such as ",[233,328,329],{},"IdentityDbContext\u003CTUser>"," or a class that derives from it.",[209,332,334],{"id":333},"package-contents","Package contents",[214,336,337,338,341],{},"The ",[233,339,340],{},"AuthEndpoints"," package includes these modules:",[343,344,345,360,363,366,369],"ul",{},[346,347,348,349,352,353,356,357,261],"li",{},"The facade: ",[233,350,351],{},"AddAuthEndpoints",", ",[233,354,355],{},"UseAuthEndpoints",", and ",[233,358,359],{},"MapAuthEndpoints",[346,361,362],{},"Identity management, cookie sign-in, and Identity bearer sign-in.",[346,364,365],{},"JWT with an HttpOnly refresh cookie.",[346,367,368],{},"Passkeys (WebAuthn).",[346,370,371],{},"ReAuth step-up.",[209,373,375],{"id":374},"optional-external-oauth","Optional: External OAuth",[214,377,378,379,381,382,385],{},"GitHub and Google sign-in ship as preview packages. ",[233,380,359],{}," does not map them. Install the provider package that you use. Each one depends on ",[233,383,384],{},"AuthEndpoints.External.OAuth",", which has no GitHub or Google handler of its own.",[214,387,388],{},[217,389,393],{"href":390,"rel":391},"https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FAuthEndpoints.External.OAuth\u002F",[392],"nofollow",[221,394],{"alt":223,"src":395},"https:\u002F\u002Fimg.shields.io\u002Fnuget\u002Fvpre\u002FAuthEndpoints.External.OAuth?label=External.OAuth&logo=NuGet&style=flat-square",[226,397,399],{"className":228,"code":398,"language":230,"meta":231,"style":231},"dotnet add package AuthEndpoints.OAuth.GitHub --prerelease\ndotnet add package AuthEndpoints.OAuth.Google --prerelease\n",[233,400,401,415],{"__ignoreMap":231},[236,402,403,405,407,409,412],{"class":238,"line":239},[236,404,243],{"class":242},[236,406,247],{"class":246},[236,408,250],{"class":246},[236,410,411],{"class":246}," AuthEndpoints.OAuth.GitHub",[236,413,414],{"class":246}," --prerelease\n",[236,416,418,420,422,424,427],{"class":238,"line":417},2,[236,419,243],{"class":242},[236,421,247],{"class":246},[236,423,250],{"class":246},[236,425,426],{"class":246}," AuthEndpoints.OAuth.Google",[236,428,414],{"class":246},[214,430,431,432,261],{},"These packages have their own version numbers. See ",[217,433,154],{"href":434},"\u002Fmodules\u002Fexternal-oauth\u002F",[209,436,438],{"id":437},"next-steps","Next steps",[343,440,441,447,452],{},[346,442,443],{},[217,444,446],{"href":445},"\u002Fgetting-started\u002Fquick-start\u002F","Quick start: add cookie sign-in to an API",[346,448,449],{},[217,450,23],{"href":451},"\u002Fgetting-started\u002Fchoose-a-sign-in-stack\u002F",[346,453,454],{},[217,455,28],{"href":456},"\u002Fgetting-started\u002Fai-agents\u002F",[458,459,460],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":231,"searchDepth":239,"depth":417,"links":462},[463,464,465,466,467],{"id":211,"depth":417,"text":212},{"id":264,"depth":417,"text":265},{"id":333,"depth":417,"text":334},{"id":374,"depth":417,"text":375},{"id":437,"depth":417,"text":438},"Add the AuthEndpoints NuGet package to your ASP.NET Core project.","md",null,{},{"icon":16},{"title":13,"description":468},"LJpLAfPwK1lAEzpdQmIRnOqtWXVbmIlPfyV8TROliVo",[476,478],{"title":10,"path":6,"stem":7,"description":477,"icon":11,"children":-1},"AuthEndpoints is an ASP.NET Core library of ready-made Identity auth endpoints for web and mobile clients.",{"title":18,"path":19,"stem":20,"description":479,"icon":21,"children":-1},"Build a minimal ASP.NET Core API where a user registers, confirms their email, signs in with a cookie, and signs out.",1791123625764]