[{"data":1,"prerenderedAt":2030},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started\u002Fquick-start":203,"\u002Fgetting-started\u002Fquick-start-surround":2025},[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":205,"body":206,"description":2018,"extension":2019,"links":2020,"meta":2021,"navigation":2022,"path":19,"seo":2023,"stem":20,"__hash__":2024},"docs\u002F1.getting-started\u002F3.quick-start.md","Quick start: add cookie sign-in to an API",{"type":207,"value":208,"toc":2005},"minimark",[209,218,221,226,229,295,298,302,309,1236,1239,1267,1281,1285,1297,1311,1315,1361,1368,1372,1390,1409,1413,1417,1466,1481,1484,1500,1505,1509,1512,1540,1550,1570,1614,1625,1629,1637,1641,1648,1720,1737,1756,1862,1872,1876,1887,1953,1968,1972,2001],[210,211,212,213,217],"p",{},"In this tutorial you build a minimal API that uses AuthEndpoints for cookie sign-in. By the end, a user can register, confirm their email, sign in, call a protected endpoint, and sign out. You use ",[214,215,216],"code",{},"curl"," as the client, so you need no front end.",[210,219,220],{},"You need the .NET 10 SDK.",[222,223,225],"h2",{"id":224},"create-the-project","Create the project",[210,227,228],{},"Create an empty web project and add the packages:",[230,231,236],"pre",{"className":232,"code":233,"language":234,"meta":235,"style":235},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dotnet new web -n AuthDemo\ncd AuthDemo\ndotnet add package AuthEndpoints\ndotnet add package Microsoft.EntityFrameworkCore.Sqlite\n","bash","",[214,237,238,260,269,283],{"__ignoreMap":235},[239,240,243,247,251,254,257],"span",{"class":241,"line":242},"line",1,[239,244,246],{"class":245},"sBMFI","dotnet",[239,248,250],{"class":249},"sfazB"," new",[239,252,253],{"class":249}," web",[239,255,256],{"class":249}," -n",[239,258,259],{"class":249}," AuthDemo\n",[239,261,263,267],{"class":241,"line":262},2,[239,264,266],{"class":265},"s2Zo4","cd",[239,268,259],{"class":249},[239,270,272,274,277,280],{"class":241,"line":271},3,[239,273,246],{"class":245},[239,275,276],{"class":249}," add",[239,278,279],{"class":249}," package",[239,281,282],{"class":249}," AuthEndpoints\n",[239,284,286,288,290,292],{"class":241,"line":285},4,[239,287,246],{"class":245},[239,289,276],{"class":249},[239,291,279],{"class":249},[239,293,294],{"class":249}," Microsoft.EntityFrameworkCore.Sqlite\n",[210,296,297],{},"The tutorial uses SQLite so you can run it without a database server. Any EF Core provider works.",[222,299,301],{"id":300},"wire-the-host","Wire the host",[210,303,304,305,308],{},"Replace ",[214,306,307],{},"Program.cs"," with this code:",[230,310,314],{"className":311,"code":312,"language":313,"meta":235,"style":235},"language-cs shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","using AuthEndpoints;\nusing Microsoft.AspNetCore.Identity;\nusing Microsoft.AspNetCore.Identity.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddDbContext\u003CAppDbContext>(o => o.UseSqlite(\"Data Source=app.db\"));\n\nbuilder.Services.AddAuthEndpoints\u003CAppUser, AppDbContext>(o =>\n{\n    o.Passkeys.ServerDomain = \"localhost\";\n});\n\nbuilder.Services.AddTransient\u003CIEmailSender\u003CAppUser>, ConsoleEmailSender>();\n\nvar app = builder.Build();\n\nusing (var scope = app.Services.CreateScope())\n{\n    scope.ServiceProvider.GetRequiredService\u003CAppDbContext>().Database.EnsureCreated();\n}\n\napp.UseAuthEndpoints();\napp.MapAuthEndpoints\u003CAppUser>();\n\napp.MapGet(\"\u002Fme\", (System.Security.Claims.ClaimsPrincipal user) => new { email = user.Identity!.Name })\n    .RequireAuthorization();\n\napp.Run();\n\npublic class AppUser : IdentityUser { }\n\npublic class AppDbContext(DbContextOptions\u003CAppDbContext> options) : IdentityDbContext\u003CAppUser>(options) { }\n\npublic class ConsoleEmailSender(ILogger\u003CConsoleEmailSender> logger) : IEmailSender\u003CAppUser>\n{\n    public Task SendConfirmationLinkAsync(AppUser user, string email, string confirmationLink)\n    {\n        logger.LogInformation(\"Confirm {Email}: {Link}\", email, confirmationLink);\n        return Task.CompletedTask;\n    }\n\n    public Task SendPasswordResetLinkAsync(AppUser user, string email, string resetLink)\n    {\n        logger.LogInformation(\"Reset link for {Email}: {Link}\", email, resetLink);\n        return Task.CompletedTask;\n    }\n\n    public Task SendPasswordResetCodeAsync(AppUser user, string email, string resetCode)\n    {\n        logger.LogInformation(\"Reset code for {Email}: {Code}\", email, resetCode);\n        return Task.CompletedTask;\n    }\n}\n","cs",[214,315,316,330,350,371,383,390,419,424,476,481,513,519,548,554,559,591,596,616,621,651,656,689,695,700,713,729,734,808,819,824,836,841,865,870,916,921,959,964,1000,1006,1036,1051,1057,1062,1093,1098,1126,1139,1144,1149,1180,1185,1213,1226,1231],{"__ignoreMap":235},[239,317,318,322,326],{"class":241,"line":242},[239,319,321],{"class":320},"sbssI","using",[239,323,325],{"class":324},"sTEyZ"," AuthEndpoints",[239,327,329],{"class":328},"sMK4o",";\n",[239,331,332,334,337,340,343,345,348],{"class":241,"line":262},[239,333,321],{"class":320},[239,335,336],{"class":324}," Microsoft",[239,338,339],{"class":328},".",[239,341,342],{"class":324},"AspNetCore",[239,344,339],{"class":328},[239,346,347],{"class":324},"Identity",[239,349,329],{"class":328},[239,351,352,354,356,358,360,362,364,366,369],{"class":241,"line":271},[239,353,321],{"class":320},[239,355,336],{"class":324},[239,357,339],{"class":328},[239,359,342],{"class":324},[239,361,339],{"class":328},[239,363,347],{"class":324},[239,365,339],{"class":328},[239,367,368],{"class":324},"EntityFrameworkCore",[239,370,329],{"class":328},[239,372,373,375,377,379,381],{"class":241,"line":285},[239,374,321],{"class":320},[239,376,336],{"class":324},[239,378,339],{"class":328},[239,380,368],{"class":324},[239,382,329],{"class":328},[239,384,386],{"class":241,"line":385},5,[239,387,389],{"emptyLinePlaceholder":388},true,"\n",[239,391,393,396,399,402,405,407,410,413,416],{"class":241,"line":392},6,[239,394,395],{"class":245},"var",[239,397,398],{"class":245}," builder",[239,400,401],{"class":328}," =",[239,403,404],{"class":324}," WebApplication",[239,406,339],{"class":328},[239,408,409],{"class":265},"CreateBuilder",[239,411,412],{"class":328},"(",[239,414,415],{"class":324},"args",[239,417,418],{"class":328},");\n",[239,420,422],{"class":241,"line":421},7,[239,423,389],{"emptyLinePlaceholder":388},[239,425,427,430,432,435,437,440,443,446,449,452,455,458,460,463,465,468,471,473],{"class":241,"line":426},8,[239,428,429],{"class":324},"builder",[239,431,339],{"class":328},[239,433,434],{"class":324},"Services",[239,436,339],{"class":328},[239,438,439],{"class":265},"AddDbContext",[239,441,442],{"class":328},"\u003C",[239,444,445],{"class":245},"AppDbContext",[239,447,448],{"class":328},">(",[239,450,451],{"class":245},"o",[239,453,454],{"class":328}," =>",[239,456,457],{"class":324}," o",[239,459,339],{"class":328},[239,461,462],{"class":265},"UseSqlite",[239,464,412],{"class":328},[239,466,467],{"class":328},"\"",[239,469,470],{"class":249},"Data Source=app.db",[239,472,467],{"class":328},[239,474,475],{"class":328},"));\n",[239,477,479],{"class":241,"line":478},9,[239,480,389],{"emptyLinePlaceholder":388},[239,482,484,486,488,490,492,495,497,500,503,506,508,510],{"class":241,"line":483},10,[239,485,429],{"class":324},[239,487,339],{"class":328},[239,489,434],{"class":324},[239,491,339],{"class":328},[239,493,494],{"class":265},"AddAuthEndpoints",[239,496,442],{"class":328},[239,498,499],{"class":245},"AppUser",[239,501,502],{"class":328},",",[239,504,505],{"class":245}," AppDbContext",[239,507,448],{"class":328},[239,509,451],{"class":245},[239,511,512],{"class":328}," =>\n",[239,514,516],{"class":241,"line":515},11,[239,517,518],{"class":328},"{\n",[239,520,522,525,527,530,532,535,538,541,544,546],{"class":241,"line":521},12,[239,523,524],{"class":324},"    o",[239,526,339],{"class":328},[239,528,529],{"class":324},"Passkeys",[239,531,339],{"class":328},[239,533,534],{"class":324},"ServerDomain ",[239,536,537],{"class":328},"=",[239,539,540],{"class":328}," \"",[239,542,543],{"class":249},"localhost",[239,545,467],{"class":328},[239,547,329],{"class":328},[239,549,551],{"class":241,"line":550},13,[239,552,553],{"class":328},"});\n",[239,555,557],{"class":241,"line":556},14,[239,558,389],{"emptyLinePlaceholder":388},[239,560,562,564,566,568,570,573,575,578,580,582,585,588],{"class":241,"line":561},15,[239,563,429],{"class":324},[239,565,339],{"class":328},[239,567,434],{"class":324},[239,569,339],{"class":328},[239,571,572],{"class":265},"AddTransient",[239,574,442],{"class":328},[239,576,577],{"class":245},"IEmailSender",[239,579,442],{"class":328},[239,581,499],{"class":245},[239,583,584],{"class":328},">,",[239,586,587],{"class":245}," ConsoleEmailSender",[239,589,590],{"class":328},">();\n",[239,592,594],{"class":241,"line":593},16,[239,595,389],{"emptyLinePlaceholder":388},[239,597,599,601,604,606,608,610,613],{"class":241,"line":598},17,[239,600,395],{"class":245},[239,602,603],{"class":245}," app",[239,605,401],{"class":328},[239,607,398],{"class":324},[239,609,339],{"class":328},[239,611,612],{"class":265},"Build",[239,614,615],{"class":328},"();\n",[239,617,619],{"class":241,"line":618},18,[239,620,389],{"emptyLinePlaceholder":388},[239,622,624,627,630,632,635,637,639,641,643,645,648],{"class":241,"line":623},19,[239,625,321],{"class":626},"s7zQu",[239,628,629],{"class":328}," (",[239,631,395],{"class":245},[239,633,634],{"class":245}," scope",[239,636,401],{"class":328},[239,638,603],{"class":324},[239,640,339],{"class":328},[239,642,434],{"class":324},[239,644,339],{"class":328},[239,646,647],{"class":265},"CreateScope",[239,649,650],{"class":328},"())\n",[239,652,654],{"class":241,"line":653},20,[239,655,518],{"class":328},[239,657,659,662,664,667,669,672,674,676,679,682,684,687],{"class":241,"line":658},21,[239,660,661],{"class":324},"    scope",[239,663,339],{"class":328},[239,665,666],{"class":324},"ServiceProvider",[239,668,339],{"class":328},[239,670,671],{"class":265},"GetRequiredService",[239,673,442],{"class":328},[239,675,445],{"class":245},[239,677,678],{"class":328},">().",[239,680,681],{"class":324},"Database",[239,683,339],{"class":328},[239,685,686],{"class":265},"EnsureCreated",[239,688,615],{"class":328},[239,690,692],{"class":241,"line":691},22,[239,693,694],{"class":328},"}\n",[239,696,698],{"class":241,"line":697},23,[239,699,389],{"emptyLinePlaceholder":388},[239,701,703,706,708,711],{"class":241,"line":702},24,[239,704,705],{"class":324},"app",[239,707,339],{"class":328},[239,709,710],{"class":265},"UseAuthEndpoints",[239,712,615],{"class":328},[239,714,716,718,720,723,725,727],{"class":241,"line":715},25,[239,717,705],{"class":324},[239,719,339],{"class":328},[239,721,722],{"class":265},"MapAuthEndpoints",[239,724,442],{"class":328},[239,726,499],{"class":245},[239,728,590],{"class":328},[239,730,732],{"class":241,"line":731},26,[239,733,389],{"emptyLinePlaceholder":388},[239,735,737,739,741,744,746,748,751,753,755,757,760,762,765,767,770,772,775,778,781,783,785,788,791,793,795,797,799,802,805],{"class":241,"line":736},27,[239,738,705],{"class":324},[239,740,339],{"class":328},[239,742,743],{"class":265},"MapGet",[239,745,412],{"class":328},[239,747,467],{"class":328},[239,749,750],{"class":249},"\u002Fme",[239,752,467],{"class":328},[239,754,502],{"class":328},[239,756,629],{"class":328},[239,758,759],{"class":245},"System",[239,761,339],{"class":328},[239,763,764],{"class":245},"Security",[239,766,339],{"class":328},[239,768,769],{"class":245},"Claims",[239,771,339],{"class":328},[239,773,774],{"class":245},"ClaimsPrincipal",[239,776,777],{"class":245}," user",[239,779,780],{"class":328},")",[239,782,454],{"class":328},[239,784,250],{"class":328},[239,786,787],{"class":328}," {",[239,789,790],{"class":324}," email ",[239,792,537],{"class":328},[239,794,777],{"class":324},[239,796,339],{"class":328},[239,798,347],{"class":324},[239,800,801],{"class":328},"!.",[239,803,804],{"class":324},"Name ",[239,806,807],{"class":328},"})\n",[239,809,811,814,817],{"class":241,"line":810},28,[239,812,813],{"class":328},"    .",[239,815,816],{"class":265},"RequireAuthorization",[239,818,615],{"class":328},[239,820,822],{"class":241,"line":821},29,[239,823,389],{"emptyLinePlaceholder":388},[239,825,827,829,831,834],{"class":241,"line":826},30,[239,828,705],{"class":324},[239,830,339],{"class":328},[239,832,833],{"class":265},"Run",[239,835,615],{"class":328},[239,837,839],{"class":241,"line":838},31,[239,840,389],{"emptyLinePlaceholder":388},[239,842,844,848,851,854,857,860,862],{"class":241,"line":843},32,[239,845,847],{"class":846},"spNyl","public",[239,849,850],{"class":245}," class",[239,852,853],{"class":245}," AppUser",[239,855,856],{"class":328}," :",[239,858,859],{"class":245}," IdentityUser",[239,861,787],{"class":328},[239,863,864],{"class":328}," }\n",[239,866,868],{"class":241,"line":867},33,[239,869,389],{"emptyLinePlaceholder":388},[239,871,873,875,877,879,881,884,886,888,891,894,896,898,901,903,905,907,910,912,914],{"class":241,"line":872},34,[239,874,847],{"class":846},[239,876,850],{"class":245},[239,878,505],{"class":245},[239,880,412],{"class":328},[239,882,883],{"class":245},"DbContextOptions",[239,885,442],{"class":328},[239,887,445],{"class":245},[239,889,890],{"class":328},">",[239,892,893],{"class":245}," options",[239,895,780],{"class":328},[239,897,856],{"class":328},[239,899,900],{"class":245}," IdentityDbContext",[239,902,442],{"class":328},[239,904,499],{"class":245},[239,906,448],{"class":328},[239,908,909],{"class":324},"options",[239,911,780],{"class":328},[239,913,787],{"class":328},[239,915,864],{"class":328},[239,917,919],{"class":241,"line":918},35,[239,920,389],{"emptyLinePlaceholder":388},[239,922,924,926,928,930,932,935,937,940,942,945,947,949,952,954,956],{"class":241,"line":923},36,[239,925,847],{"class":846},[239,927,850],{"class":245},[239,929,587],{"class":245},[239,931,412],{"class":328},[239,933,934],{"class":245},"ILogger",[239,936,442],{"class":328},[239,938,939],{"class":245},"ConsoleEmailSender",[239,941,890],{"class":328},[239,943,944],{"class":245}," logger",[239,946,780],{"class":328},[239,948,856],{"class":328},[239,950,951],{"class":245}," IEmailSender",[239,953,442],{"class":328},[239,955,499],{"class":245},[239,957,958],{"class":328},">\n",[239,960,962],{"class":241,"line":961},37,[239,963,518],{"class":328},[239,965,967,970,973,976,978,980,982,984,987,990,992,994,997],{"class":241,"line":966},38,[239,968,969],{"class":846},"    public",[239,971,972],{"class":245}," Task",[239,974,975],{"class":265}," SendConfirmationLinkAsync",[239,977,412],{"class":328},[239,979,499],{"class":245},[239,981,777],{"class":245},[239,983,502],{"class":328},[239,985,986],{"class":328}," string",[239,988,989],{"class":245}," email",[239,991,502],{"class":328},[239,993,986],{"class":328},[239,995,996],{"class":245}," confirmationLink",[239,998,999],{"class":328},")\n",[239,1001,1003],{"class":241,"line":1002},39,[239,1004,1005],{"class":328},"    {\n",[239,1007,1009,1012,1014,1017,1019,1021,1024,1026,1028,1030,1032,1034],{"class":241,"line":1008},40,[239,1010,1011],{"class":324},"        logger",[239,1013,339],{"class":328},[239,1015,1016],{"class":265},"LogInformation",[239,1018,412],{"class":328},[239,1020,467],{"class":328},[239,1022,1023],{"class":249},"Confirm {Email}: {Link}",[239,1025,467],{"class":328},[239,1027,502],{"class":328},[239,1029,989],{"class":324},[239,1031,502],{"class":328},[239,1033,996],{"class":324},[239,1035,418],{"class":328},[239,1037,1039,1042,1044,1046,1049],{"class":241,"line":1038},41,[239,1040,1041],{"class":626},"        return",[239,1043,972],{"class":324},[239,1045,339],{"class":328},[239,1047,1048],{"class":324},"CompletedTask",[239,1050,329],{"class":328},[239,1052,1054],{"class":241,"line":1053},42,[239,1055,1056],{"class":328},"    }\n",[239,1058,1060],{"class":241,"line":1059},43,[239,1061,389],{"emptyLinePlaceholder":388},[239,1063,1065,1067,1069,1072,1074,1076,1078,1080,1082,1084,1086,1088,1091],{"class":241,"line":1064},44,[239,1066,969],{"class":846},[239,1068,972],{"class":245},[239,1070,1071],{"class":265}," SendPasswordResetLinkAsync",[239,1073,412],{"class":328},[239,1075,499],{"class":245},[239,1077,777],{"class":245},[239,1079,502],{"class":328},[239,1081,986],{"class":328},[239,1083,989],{"class":245},[239,1085,502],{"class":328},[239,1087,986],{"class":328},[239,1089,1090],{"class":245}," resetLink",[239,1092,999],{"class":328},[239,1094,1096],{"class":241,"line":1095},45,[239,1097,1005],{"class":328},[239,1099,1101,1103,1105,1107,1109,1111,1114,1116,1118,1120,1122,1124],{"class":241,"line":1100},46,[239,1102,1011],{"class":324},[239,1104,339],{"class":328},[239,1106,1016],{"class":265},[239,1108,412],{"class":328},[239,1110,467],{"class":328},[239,1112,1113],{"class":249},"Reset link for {Email}: {Link}",[239,1115,467],{"class":328},[239,1117,502],{"class":328},[239,1119,989],{"class":324},[239,1121,502],{"class":328},[239,1123,1090],{"class":324},[239,1125,418],{"class":328},[239,1127,1129,1131,1133,1135,1137],{"class":241,"line":1128},47,[239,1130,1041],{"class":626},[239,1132,972],{"class":324},[239,1134,339],{"class":328},[239,1136,1048],{"class":324},[239,1138,329],{"class":328},[239,1140,1142],{"class":241,"line":1141},48,[239,1143,1056],{"class":328},[239,1145,1147],{"class":241,"line":1146},49,[239,1148,389],{"emptyLinePlaceholder":388},[239,1150,1152,1154,1156,1159,1161,1163,1165,1167,1169,1171,1173,1175,1178],{"class":241,"line":1151},50,[239,1153,969],{"class":846},[239,1155,972],{"class":245},[239,1157,1158],{"class":265}," SendPasswordResetCodeAsync",[239,1160,412],{"class":328},[239,1162,499],{"class":245},[239,1164,777],{"class":245},[239,1166,502],{"class":328},[239,1168,986],{"class":328},[239,1170,989],{"class":245},[239,1172,502],{"class":328},[239,1174,986],{"class":328},[239,1176,1177],{"class":245}," resetCode",[239,1179,999],{"class":328},[239,1181,1183],{"class":241,"line":1182},51,[239,1184,1005],{"class":328},[239,1186,1188,1190,1192,1194,1196,1198,1201,1203,1205,1207,1209,1211],{"class":241,"line":1187},52,[239,1189,1011],{"class":324},[239,1191,339],{"class":328},[239,1193,1016],{"class":265},[239,1195,412],{"class":328},[239,1197,467],{"class":328},[239,1199,1200],{"class":249},"Reset code for {Email}: {Code}",[239,1202,467],{"class":328},[239,1204,502],{"class":328},[239,1206,989],{"class":324},[239,1208,502],{"class":328},[239,1210,1177],{"class":324},[239,1212,418],{"class":328},[239,1214,1216,1218,1220,1222,1224],{"class":241,"line":1215},53,[239,1217,1041],{"class":626},[239,1219,972],{"class":324},[239,1221,339],{"class":328},[239,1223,1048],{"class":324},[239,1225,329],{"class":328},[239,1227,1229],{"class":241,"line":1228},54,[239,1230,1056],{"class":328},[239,1232,1234],{"class":241,"line":1233},55,[239,1235,694],{"class":328},[210,1237,1238],{},"Here is what the AuthEndpoints calls do:",[1240,1241,1242,1249,1254],"ul",{},[1243,1244,1245,1248],"li",{},[214,1246,1247],{},"AddAuthEndpoints\u003CAppUser, AppDbContext>"," registers Identity with EF Core stores, the application cookie, passkeys, step-up, antiforgery, and the rate-limit policies.",[1243,1250,1251,1253],{},[214,1252,710],{}," adds authentication, authorization, rate limiting, and antiforgery middleware. In a real app, call it after your exception-handling middleware.",[1243,1255,1256,1259,1260,1263,1264,339],{},[214,1257,1258],{},"MapAuthEndpoints\u003CAppUser>"," maps the routes under ",[214,1261,1262],{},"\u002Fidentity"," and ",[214,1265,1266],{},"\u002Faccount",[210,1268,1269,1271,1272,1274,1275,1280],{},[214,1270,939],{}," writes links to the log so you can follow them by hand. ",[214,1273,686],{}," builds the schema without migrations. Both are for local use only. See ",[1276,1277,1279],"a",{"href":1278},"\u002Fguides\u002Fproduction\u002F","Production"," before you deploy.",[222,1282,1284],{"id":1283},"run-the-app","Run the app",[230,1286,1288],{"className":232,"code":1287,"language":234,"meta":235,"style":235},"dotnet run\n",[214,1289,1290],{"__ignoreMap":235},[239,1291,1292,1294],{"class":241,"line":242},[239,1293,246],{"class":245},[239,1295,1296],{"class":249}," run\n",[210,1298,1299,1300,1303,1304,1307,1308,1310],{},"Note the URL in the ",[214,1301,1302],{},"Now listening on"," log line. The commands below use ",[214,1305,1306],{},"http:\u002F\u002Flocalhost:5265",". Replace it with your URL. Open a second terminal for the ",[214,1309,216],{}," commands.",[222,1312,1314],{"id":1313},"register-a-user","Register a user",[230,1316,1318],{"className":232,"code":1317,"language":234,"meta":235,"style":235},"curl -i -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"email\":\"ada@example.com\",\"password\":\"Passw0rd!\"}' \\\n  http:\u002F\u002Flocalhost:5265\u002Fidentity\u002Fregister\n",[214,1319,1320,1340,1356],{"__ignoreMap":235},[239,1321,1322,1324,1327,1330,1332,1335,1337],{"class":241,"line":242},[239,1323,216],{"class":245},[239,1325,1326],{"class":249}," -i",[239,1328,1329],{"class":249}," -H",[239,1331,540],{"class":328},[239,1333,1334],{"class":249},"Content-Type: application\u002Fjson",[239,1336,467],{"class":328},[239,1338,1339],{"class":324}," \\\n",[239,1341,1342,1345,1348,1351,1354],{"class":241,"line":262},[239,1343,1344],{"class":249},"  -d",[239,1346,1347],{"class":328}," '",[239,1349,1350],{"class":249},"{\"email\":\"ada@example.com\",\"password\":\"Passw0rd!\"}",[239,1352,1353],{"class":328},"'",[239,1355,1339],{"class":324},[239,1357,1358],{"class":241,"line":271},[239,1359,1360],{"class":249},"  http:\u002F\u002Flocalhost:5265\u002Fidentity\u002Fregister\n",[210,1362,1363,1364,1367],{},"The response is ",[214,1365,1366],{},"200 OK",". AuthEndpoints requires a confirmed account by default, so the user can't sign in yet.",[222,1369,1371],{"id":1370},"confirm-the-email","Confirm the email",[210,1373,1374,1375,1378,1379,1382,1383,1386,1387,1389],{},"Find the ",[214,1376,1377],{},"Confirm ada@example.com"," line in the app log. Copy the link. The log HTML-encodes ",[214,1380,1381],{},"&"," as ",[214,1384,1385],{},"&amp;",", so change it back to ",[214,1388,1381],{},", then open the link:",[230,1391,1393],{"className":232,"code":1392,"language":234,"meta":235,"style":235},"curl -i \"http:\u002F\u002Flocalhost:5265\u002Fidentity\u002FconfirmEmail?userId=...&code=...\"\n",[214,1394,1395],{"__ignoreMap":235},[239,1396,1397,1399,1401,1403,1406],{"class":241,"line":242},[239,1398,216],{"class":245},[239,1400,1326],{"class":249},[239,1402,540],{"class":328},[239,1404,1405],{"class":249},"http:\u002F\u002Flocalhost:5265\u002Fidentity\u002FconfirmEmail?userId=...&code=...",[239,1407,1408],{"class":328},"\"\n",[210,1410,1363,1411,339],{},[214,1412,1366],{},[222,1414,1416],{"id":1415},"sign-in","Sign in",[230,1418,1420],{"className":232,"code":1419,"language":234,"meta":235,"style":235},"curl -i -c cookies.txt -b cookies.txt -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"email\":\"ada@example.com\",\"password\":\"Passw0rd!\"}' \\\n  http:\u002F\u002Flocalhost:5265\u002Fidentity\u002Flogin\n",[214,1421,1422,1449,1461],{"__ignoreMap":235},[239,1423,1424,1426,1428,1431,1434,1437,1439,1441,1443,1445,1447],{"class":241,"line":242},[239,1425,216],{"class":245},[239,1427,1326],{"class":249},[239,1429,1430],{"class":249}," -c",[239,1432,1433],{"class":249}," cookies.txt",[239,1435,1436],{"class":249}," -b",[239,1438,1433],{"class":249},[239,1440,1329],{"class":249},[239,1442,540],{"class":328},[239,1444,1334],{"class":249},[239,1446,467],{"class":328},[239,1448,1339],{"class":324},[239,1450,1451,1453,1455,1457,1459],{"class":241,"line":262},[239,1452,1344],{"class":249},[239,1454,1347],{"class":328},[239,1456,1350],{"class":249},[239,1458,1353],{"class":328},[239,1460,1339],{"class":324},[239,1462,1463],{"class":241,"line":271},[239,1464,1465],{"class":249},"  http:\u002F\u002Flocalhost:5265\u002Fidentity\u002Flogin\n",[210,1467,1363,1468,1470,1471,1474,1475,1477,1478,339],{},[214,1469,1366],{}," with a ",[214,1472,1473],{},"Set-Cookie: .AspNetCore.Identity.Application=..."," header. ",[214,1476,216],{}," stores the cookie in ",[214,1479,1480],{},"cookies.txt",[210,1482,1483],{},"Call the protected endpoint with the cookie:",[230,1485,1487],{"className":232,"code":1486,"language":234,"meta":235,"style":235},"curl -b cookies.txt http:\u002F\u002Flocalhost:5265\u002Fme\n",[214,1488,1489],{"__ignoreMap":235},[239,1490,1491,1493,1495,1497],{"class":241,"line":242},[239,1492,216],{"class":245},[239,1494,1436],{"class":249},[239,1496,1433],{"class":249},[239,1498,1499],{"class":249}," http:\u002F\u002Flocalhost:5265\u002Fme\n",[210,1501,1363,1502,339],{},[214,1503,1504],{},"{\"email\":\"ada@example.com\"}",[222,1506,1508],{"id":1507},"sign-out","Sign out",[210,1510,1511],{},"Sign-out changes state on a cookie session, so it needs a CSRF token. Try it without one first:",[230,1513,1515],{"className":232,"code":1514,"language":234,"meta":235,"style":235},"curl -i -c cookies.txt -b cookies.txt -X POST http:\u002F\u002Flocalhost:5265\u002Fidentity\u002Flogout\n",[214,1516,1517],{"__ignoreMap":235},[239,1518,1519,1521,1523,1525,1527,1529,1531,1534,1537],{"class":241,"line":242},[239,1520,216],{"class":245},[239,1522,1326],{"class":249},[239,1524,1430],{"class":249},[239,1526,1433],{"class":249},[239,1528,1436],{"class":249},[239,1530,1433],{"class":249},[239,1532,1533],{"class":249}," -X",[239,1535,1536],{"class":249}," POST",[239,1538,1539],{"class":249}," http:\u002F\u002Flocalhost:5265\u002Fidentity\u002Flogout\n",[210,1541,1363,1542,1545,1546,1549],{},[214,1543,1544],{},"400 Bad Request",". Get a token, then send it in the ",[214,1547,1548],{},"RequestVerificationToken"," header:",[230,1551,1553],{"className":232,"code":1552,"language":234,"meta":235,"style":235},"curl -c cookies.txt -b cookies.txt http:\u002F\u002Flocalhost:5265\u002Fidentity\u002FcsrfToken\n",[214,1554,1555],{"__ignoreMap":235},[239,1556,1557,1559,1561,1563,1565,1567],{"class":241,"line":242},[239,1558,216],{"class":245},[239,1560,1430],{"class":249},[239,1562,1433],{"class":249},[239,1564,1436],{"class":249},[239,1566,1433],{"class":249},[239,1568,1569],{"class":249}," http:\u002F\u002Flocalhost:5265\u002Fidentity\u002FcsrfToken\n",[230,1571,1573],{"className":232,"code":1572,"language":234,"meta":235,"style":235},"curl -i -c cookies.txt -b cookies.txt -X POST \\\n  -H \"RequestVerificationToken: \u003CcsrfToken from the previous response>\" \\\n  http:\u002F\u002Flocalhost:5265\u002Fidentity\u002Flogout\n",[214,1574,1575,1595,1609],{"__ignoreMap":235},[239,1576,1577,1579,1581,1583,1585,1587,1589,1591,1593],{"class":241,"line":242},[239,1578,216],{"class":245},[239,1580,1326],{"class":249},[239,1582,1430],{"class":249},[239,1584,1433],{"class":249},[239,1586,1436],{"class":249},[239,1588,1433],{"class":249},[239,1590,1533],{"class":249},[239,1592,1536],{"class":249},[239,1594,1339],{"class":324},[239,1596,1597,1600,1602,1605,1607],{"class":241,"line":262},[239,1598,1599],{"class":249},"  -H",[239,1601,540],{"class":328},[239,1603,1604],{"class":249},"RequestVerificationToken: \u003CcsrfToken from the previous response>",[239,1606,467],{"class":328},[239,1608,1339],{"class":324},[239,1610,1611],{"class":241,"line":271},[239,1612,1613],{"class":249},"  http:\u002F\u002Flocalhost:5265\u002Fidentity\u002Flogout\n",[210,1615,1363,1616,1618,1619,1621,1622,339],{},[214,1617,1366],{},". Call ",[214,1620,750],{}," again and you get ",[214,1623,1624],{},"401 Unauthorized",[222,1626,1628],{"id":1627},"what-you-built","What you built",[210,1630,1631,1632,1636],{},"You have an API with password registration, email confirmation, cookie sign-in, and CSRF-protected sign-out. The same host also maps account management, two-factor, password reset, passkeys, and step-up routes. See ",[1276,1633,1635],{"href":1634},"\u002Fmodules\u002Fendpoints\u002F","Endpoints"," for the full list.",[222,1638,1640],{"id":1639},"native-and-mobile","Native and mobile",[210,1642,1643,1644,1647],{},"To issue tokens instead of a cookie, pass ",[214,1645,1646],{},"AuthEndpointsSignIn.IdentityBearer"," as the first argument:",[230,1649,1651],{"className":311,"code":1650,"language":313,"meta":235,"style":235},"builder.Services.AddAuthEndpoints\u003CAppUser, AppDbContext>(AuthEndpointsSignIn.IdentityBearer, o =>\n{\n    o.Passkeys.ServerDomain = \"example.com\";\n});\n",[214,1652,1653,1689,1693,1716],{"__ignoreMap":235},[239,1654,1655,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1678,1680,1683,1685,1687],{"class":241,"line":242},[239,1656,429],{"class":324},[239,1658,339],{"class":328},[239,1660,434],{"class":324},[239,1662,339],{"class":328},[239,1664,494],{"class":265},[239,1666,442],{"class":328},[239,1668,499],{"class":245},[239,1670,502],{"class":328},[239,1672,505],{"class":245},[239,1674,448],{"class":328},[239,1676,1677],{"class":324},"AuthEndpointsSignIn",[239,1679,339],{"class":328},[239,1681,1682],{"class":324},"IdentityBearer",[239,1684,502],{"class":328},[239,1686,457],{"class":245},[239,1688,512],{"class":328},[239,1690,1691],{"class":241,"line":262},[239,1692,518],{"class":328},[239,1694,1695,1697,1699,1701,1703,1705,1707,1709,1712,1714],{"class":241,"line":271},[239,1696,524],{"class":324},[239,1698,339],{"class":328},[239,1700,529],{"class":324},[239,1702,339],{"class":328},[239,1704,534],{"class":324},[239,1706,537],{"class":328},[239,1708,540],{"class":328},[239,1710,1711],{"class":249},"example.com",[239,1713,467],{"class":328},[239,1715,329],{"class":328},[239,1717,1718],{"class":241,"line":285},[239,1719,553],{"class":328},[210,1721,1722,1725,1726,1263,1729,1732,1733,339],{},[214,1723,1724],{},"POST \u002Fidentity\u002Flogin"," then returns ",[214,1727,1728],{},"accessToken",[214,1730,1731],{},"refreshToken",". See ",[1276,1734,1736],{"href":1735},"\u002Fmodules\u002Fbearer-auth\u002F","Bearer auth",[210,1738,1739,1740,1743,1744,1747,1748,1751,1752,1755],{},"The bearer facade maps ",[214,1741,1742],{},"\u002Fidentity\u002Flogin",", ",[214,1745,1746],{},"\u002Fidentity\u002Frefresh",", and ",[214,1749,1750],{},"\u002Fidentity\u002Flogout",". It does not map ",[214,1753,1754],{},"GET \u002Fidentity\u002FcsrfToken",". Passkeys stay on, and every passkey ceremony requires a CSRF token. A bearer token does not remove that requirement on anonymous requests such as passkey registration and passkey sign-in. To use passkeys with the bearer facade, map your own token endpoint:",[230,1757,1759],{"className":311,"code":1758,"language":313,"meta":235,"style":235},"using Microsoft.AspNetCore.Antiforgery;\n\napp.MapGet(\"\u002Fidentity\u002FcsrfToken\", (IAntiforgery antiforgery, HttpContext context) =>\n    Results.Ok(new { csrfToken = antiforgery.GetAndStoreTokens(context).RequestToken }));\n",[214,1760,1761,1778,1782,1821],{"__ignoreMap":235},[239,1762,1763,1765,1767,1769,1771,1773,1776],{"class":241,"line":242},[239,1764,321],{"class":320},[239,1766,336],{"class":324},[239,1768,339],{"class":328},[239,1770,342],{"class":324},[239,1772,339],{"class":328},[239,1774,1775],{"class":324},"Antiforgery",[239,1777,329],{"class":328},[239,1779,1780],{"class":241,"line":262},[239,1781,389],{"emptyLinePlaceholder":388},[239,1783,1784,1786,1788,1790,1792,1794,1797,1799,1801,1803,1806,1809,1811,1814,1817,1819],{"class":241,"line":271},[239,1785,705],{"class":324},[239,1787,339],{"class":328},[239,1789,743],{"class":265},[239,1791,412],{"class":328},[239,1793,467],{"class":328},[239,1795,1796],{"class":249},"\u002Fidentity\u002FcsrfToken",[239,1798,467],{"class":328},[239,1800,502],{"class":328},[239,1802,629],{"class":328},[239,1804,1805],{"class":245},"IAntiforgery",[239,1807,1808],{"class":245}," antiforgery",[239,1810,502],{"class":328},[239,1812,1813],{"class":245}," HttpContext",[239,1815,1816],{"class":245}," context",[239,1818,780],{"class":328},[239,1820,512],{"class":328},[239,1822,1823,1826,1828,1831,1834,1836,1839,1841,1843,1845,1848,1850,1853,1856,1859],{"class":241,"line":285},[239,1824,1825],{"class":324},"    Results",[239,1827,339],{"class":328},[239,1829,1830],{"class":265},"Ok",[239,1832,1833],{"class":328},"(new",[239,1835,787],{"class":328},[239,1837,1838],{"class":324}," csrfToken ",[239,1840,537],{"class":328},[239,1842,1808],{"class":324},[239,1844,339],{"class":328},[239,1846,1847],{"class":265},"GetAndStoreTokens",[239,1849,412],{"class":328},[239,1851,1852],{"class":324},"context",[239,1854,1855],{"class":328},").",[239,1857,1858],{"class":324},"RequestToken ",[239,1860,1861],{"class":328},"}));\n",[210,1863,1864,1865,1867,1868,1871],{},"The client must keep the antiforgery cookie from that response and send the token in the ",[214,1866,1548],{}," header. If you do not use passkeys, set ",[214,1869,1870],{},"o.Passkeys.Enabled = false"," instead.",[222,1873,1875],{"id":1874},"roles","Roles",[210,1877,1878,1879,1882,1883,1886],{},"To use roles, call the three-type overload so ",[214,1880,1881],{},"AddRoles"," runs before ",[214,1884,1885],{},"AddEntityFrameworkStores",":",[230,1888,1890],{"className":311,"code":1889,"language":313,"meta":235,"style":235},"builder.Services.AddAuthEndpoints\u003CAppUser, AppRole, AppDbContext>(o =>\n{\n    o.Passkeys.ServerDomain = \"example.com\";\n});\n",[214,1891,1892,1923,1927,1949],{"__ignoreMap":235},[239,1893,1894,1896,1898,1900,1902,1904,1906,1908,1910,1913,1915,1917,1919,1921],{"class":241,"line":242},[239,1895,429],{"class":324},[239,1897,339],{"class":328},[239,1899,434],{"class":324},[239,1901,339],{"class":328},[239,1903,494],{"class":265},[239,1905,442],{"class":328},[239,1907,499],{"class":245},[239,1909,502],{"class":328},[239,1911,1912],{"class":245}," AppRole",[239,1914,502],{"class":328},[239,1916,505],{"class":245},[239,1918,448],{"class":328},[239,1920,451],{"class":245},[239,1922,512],{"class":328},[239,1924,1925],{"class":241,"line":262},[239,1926,518],{"class":328},[239,1928,1929,1931,1933,1935,1937,1939,1941,1943,1945,1947],{"class":241,"line":271},[239,1930,524],{"class":324},[239,1932,339],{"class":328},[239,1934,529],{"class":324},[239,1936,339],{"class":328},[239,1938,534],{"class":324},[239,1940,537],{"class":328},[239,1942,540],{"class":328},[239,1944,1711],{"class":249},[239,1946,467],{"class":328},[239,1948,329],{"class":328},[239,1950,1951],{"class":241,"line":285},[239,1952,553],{"class":328},[210,1954,1955,1956,1959,1960,1963,1964,1967],{},"Your ",[214,1957,1958],{},"DbContext"," must be ",[214,1961,1962],{},"IdentityDbContext\u003CAppUser, AppRole, TKey>"," or equivalent. Do not chain ",[214,1965,1966],{},".AddRoles\u003CTRole>()"," after the two-type overload.",[222,1969,1971],{"id":1970},"next-steps","Next steps",[1240,1973,1974,1980,1989,1996],{},[1243,1975,1976,1979],{},[1276,1977,23],{"href":1978},"\u002Fgetting-started\u002Fchoose-a-sign-in-stack\u002F"," if you need tokens, JWT, or OAuth",[1243,1981,1982,1263,1985,1988],{},[1276,1983,41],{"href":1984},"\u002Fguides\u002Fregistration\u002F",[1276,1986,46],{"href":1987},"\u002Fguides\u002Fsign-in\u002F"," for each sign-in method",[1243,1990,1991,1995],{},[1276,1992,1994],{"href":1993},"\u002Fmodules\u002Fconfiguration\u002F","Configuration"," for paths, passkeys, and JWT opt-in",[1243,1997,1998,2000],{},[1276,1999,1279],{"href":1278}," for HTTPS, email, and the passkey domain",[2002,2003,2004],"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 pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":235,"searchDepth":242,"depth":262,"links":2006},[2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017],{"id":224,"depth":262,"text":225},{"id":300,"depth":262,"text":301},{"id":1283,"depth":262,"text":1284},{"id":1313,"depth":262,"text":1314},{"id":1370,"depth":262,"text":1371},{"id":1415,"depth":262,"text":1416},{"id":1507,"depth":262,"text":1508},{"id":1627,"depth":262,"text":1628},{"id":1639,"depth":262,"text":1640},{"id":1874,"depth":262,"text":1875},{"id":1970,"depth":262,"text":1971},"Build a minimal ASP.NET Core API where a user registers, confirms their email, signs in with a cookie, and signs out.","md",null,{},{"title":18,"icon":21},{"title":205,"description":2018},"XpFiOGfDRDtu8QF8uQs1CSpehmwbFbP8KYhOkXaNEWM",[2026,2028],{"title":13,"path":14,"stem":15,"description":2027,"icon":16,"children":-1},"Add the AuthEndpoints NuGet package to your ASP.NET Core project.",{"title":23,"path":24,"stem":25,"description":2029,"icon":26,"children":-1},"Which AuthEndpoints sign-in stack fits a browser app, a native app, or both, and why.",1791123625841]