[{"data":1,"prerenderedAt":590},["ShallowReactive",2],{"navigation":3,"\u002Fmodules\u002Frate-limits":203,"\u002Fmodules\u002Frate-limits-surround":585},[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":172,"body":205,"description":578,"extension":579,"links":580,"meta":581,"navigation":582,"path":173,"seo":583,"stem":174,"__hash__":584},"docs\u002F4.modules\u002F12.rate-limits.md",{"type":206,"value":207,"toc":569},"minimark",[208,225,230,315,326,330,441,447,451,545,548,552],[209,210,211,212,216,217,220,221,224],"p",{},"All policies partition by client IP address. A rejected request returns ",[213,214,215],"code",{},"429",". Policies take effect only when the pipeline calls ",[213,218,219],{},"UseRateLimiter()",". ",[213,222,223],{},"UseAuthEndpoints"," calls it.",[226,227,229],"h2",{"id":228},"policies","Policies",[231,232,233,249],"table",{},[234,235,236],"thead",{},[237,238,239,243,246],"tr",{},[240,241,242],"th",{},"Policy constant",[240,244,245],{},"Limiter",[240,247,248],{},"Limit",[250,251,252,266,279,291,303],"tbody",{},[237,253,254,260,263],{},[255,256,257],"td",{},[213,258,259],{},"AuthEndpoints.Login",[255,261,262],{},"Token bucket",[255,264,265],{},"10 tokens. 2 tokens are added every 10 seconds.",[237,267,268,273,276],{},[255,269,270],{},[213,271,272],{},"AuthEndpoints.AccountAbuse",[255,274,275],{},"Fixed window",[255,277,278],{},"10 requests per minute",[237,280,281,286,288],{},[255,282,283],{},[213,284,285],{},"AuthEndpoints.ConfirmIdentity",[255,287,275],{},[255,289,290],{},"20 requests per minute",[237,292,293,298,300],{},[255,294,295],{},[213,296,297],{},"AuthEndpoints.Passkey.ObtainOptions",[255,299,275],{},[255,301,302],{},"5 requests per minute",[237,304,305,310,312],{},[255,306,307],{},[213,308,309],{},"AuthEndpoints.Passkey.Register",[255,311,275],{},[255,313,314],{},"3 requests per minute",[209,316,317,318,321,322,325],{},"No policy queues requests. The ",[213,319,320],{},"QueueLimit"," is ",[213,323,324],{},"0",".",[226,327,329],{"id":328},"routes-per-policy","Routes per policy",[231,331,332,342],{},[234,333,334],{},[237,335,336,339],{},[240,337,338],{},"Policy",[240,340,341],{},"Routes",[250,343,344,375,396,410,427],{},[237,345,346,350],{},[255,347,348],{},[213,349,259],{},[255,351,352,353,356,357,360,361,364,365,368,369,360,372],{},"Cookie and Identity bearer ",[213,354,355],{},"POST \u002Flogin",", JWT ",[213,358,359],{},"POST \u002Fcreate"," and ",[213,362,363],{},"POST \u002Frefresh",", passkey ",[213,366,367],{},"POST \u002Fpasskeys\u002Flogin",", external ",[213,370,371],{},"GET \u002Flogin\u002F{provider}",[213,373,374],{},"GET \u002Flink\u002F{scheme}",[237,376,377,381],{},[255,378,379],{},[213,380,272],{},[255,382,383,386,387,386,390,386,393],{},[213,384,385],{},"POST \u002Fregister",", ",[213,388,389],{},"POST \u002FresendConfirmationEmail",[213,391,392],{},"POST \u002FforgotPassword",[213,394,395],{},"POST \u002FresetPassword",[237,397,398,402],{},[255,399,400],{},[213,401,285],{},[255,403,404,386,407],{},[213,405,406],{},"POST \u002FconfirmIdentity",[213,408,409],{},"POST \u002FconfirmIdentity\u002FpasskeyOptions",[237,411,412,416],{},[255,413,414],{},[213,415,297],{},[255,417,418,386,421,386,424],{},[213,419,420],{},"POST \u002Fpasskeys\u002FcreationOptions",[213,422,423],{},"POST \u002Fpasskeys\u002FrequestOptions",[213,425,426],{},"POST \u002Fpasskeys\u002Fregister\u002Foptions",[237,428,429,433],{},[255,430,431],{},[213,432,309],{},[255,434,435,386,438],{},[213,436,437],{},"POST \u002Fpasskeys\u002Fregister",[213,439,440],{},"POST \u002Fpasskeys\u002F",[209,442,443,444,446],{},"Identity bearer ",[213,445,363],{}," has no rate limit.",[226,448,450],{"id":449},"registration","Registration",[231,452,453,463],{},[234,454,455],{},[237,456,457,460],{},[240,458,459],{},"DI call",[240,461,462],{},"Policies it registers",[250,464,465,483,498,513,534],{},[237,466,467,472],{},[255,468,469],{},[213,470,471],{},"AddCookieAuthEndpoints",[255,473,474,386,477,386,480],{},[213,475,476],{},"Login",[213,478,479],{},"AccountAbuse",[213,481,482],{},"ConfirmIdentity",[237,484,485,490],{},[255,486,487],{},[213,488,489],{},"AddBearerAuthEndpoints",[255,491,492,386,494,386,496],{},[213,493,476],{},[213,495,479],{},[213,497,482],{},[237,499,500,505],{},[255,501,502],{},[213,503,504],{},"AddJwtEndpoints",[255,506,507,386,509,386,511],{},[213,508,476],{},[213,510,479],{},[213,512,482],{},[237,514,515,520],{},[255,516,517],{},[213,518,519],{},"AddPasskeyEndpoints",[255,521,522,386,524,386,526,386,528,386,531],{},[213,523,476],{},[213,525,479],{},[213,527,482],{},[213,529,530],{},"Passkey.ObtainOptions",[213,532,533],{},"Passkey.Register",[237,535,536,541],{},[255,537,538],{},[213,539,540],{},"AddExternalAuthEndpoints",[255,542,543],{},[213,544,476],{},[209,546,547],{},"Each policy is registered once, even when several calls add it. The facade makes the matching calls for you.",[226,549,551],{"id":550},"related","Related",[553,554,555,561,565],"ul",{},[556,557,558],"li",{},[559,560,121],"a",{"href":122},[556,562,563],{},[559,564,105],{"href":106},[556,566,567],{},[559,568,194],{"href":195},{"title":570,"searchDepth":571,"depth":572,"links":573},"",1,2,[574,575,576,577],{"id":228,"depth":572,"text":229},{"id":328,"depth":572,"text":329},{"id":449,"depth":572,"text":450},{"id":550,"depth":572,"text":551},"The rate-limit policies AuthEndpoints registers, their limits, and the routes that use them.","md",null,{},{"icon":175},{"title":172,"description":578},"YU8sa1Rv7UZHOSdxuXe2klgMMqW4aNcO-rzRHp3010Y",[586,588],{"title":167,"path":168,"stem":169,"description":587,"icon":170,"children":-1},"Success and error response shapes for every AuthEndpoints module.",{"title":184,"path":185,"stem":186,"description":589,"icon":187,"children":-1},"How AuthEndpoints differs from wiring ASP.NET Core Identity yourself, from OpenIddict, and from Identity API endpoints.",1791096173121]