Vyf verkeerde wagwoorde sluit die rekening. Die kontrole en die drempel was reg, en tog kon jy tienduisend verkeerde wagwoorde stuur en dit nooit aktiveer nie, solank jy hulle almal gelyktydig stuur. Die teller was 'n lees-wysig-skryf sonder beskerming, dus het gelyktydige pogings mekaar se inkremente oorgeskryf en dit het skaars geklim. Die oplossing: hoe bou jy 'n atomiese teller op 'n sleutel-waarde-stoor sonder inkrement-bewerking, en aanvaar iemand tel in parallel.
Eenmalige aanmelding is al meer as twintig jaar 'n gevestigde standaard, en tog is SAML steeds die reël op die kwotasie wat 'n transaksie laat stol of 'n oproep na verkope ontketen. Hoe ondernemingsverifikasie 'n premie-opverkoop geword het, wie daardie wêreld gebou het en wie ons daaroor gewaarsku het, hoe wyd die grag werklik is en waarvan dit gemaak is, en die een krag wat stilweg die helfte daarvan leegtap.
Monitering is die kode wat net tydens 'n ramp loop. Daarom het ons 'n toetstuig gebou wat vir elke waarskuwingreël 'n werklike sein dryf en eers slaag wanneer die kennisgewing fisies in 'n vangaflos beland. Die eerste lopie het ons vlagskip-foutkoerswaarskuwing morsdood gevind, en toe erger: 'n behoudsinstelling het stilweg onmiddellike vervaltyd op ons logs gestempel, sodat 'n hele klas waarskuwings oor niks geëvalueer het terwyl inname gesond gelyk het.
Honderd megagrepe se dokumentasie-skermkiekies het na Cloudflare R2 geskuif, agter 'n CDN-basis wat die app uit sy eie gasheernaam aflei. Dit het in die blaaier gewerk maar niks aan die oorsprong se verkeer gedoen nie, want die bladsye wat 'n soekrobot sien, word op 127.0.0.1 vooraf gerender, waar 'n gasheernaam niks beteken nie. Die oplossing is 'n plekhouer wat die HTML uit die bou dra en die rand per versoek invul, en die rede is 'n leesalleen-lêerstelsel.
Net betyds voorsiening was standaard aan, so 'n gefedereerde identiteitsverskaffer kon rekeninge in 'n kliënt se huurgebied skep bloot deur te beweer dat iemand bestaan. Om daardie verstek af te skakel is 'n een woord verandering. Om dit af te skakel sonder om stilweg elke reeds gestoorde verbinding se gedrag te verander, waarvan nie een ooit die kolom geskryf het nie, is die werklike probleem, en die truuk wat dit opgelos het wys ook waarom 'n verstek API oppervlak is.
'n backend-for-frontend haal OAuth-tokens uit die blaaier en laat dit met niks anders as 'n ondeursigtige koekie agter. Om baie huurders vanaf een BFF te bedien is meestal 'n loodgietersprobleem, totdat terugkanaal-afmelding opdaag: 'n bediener-tot-bediener POST sonder koekie, sonder sessie en sonder blaaier, waar die enigste ding wat die huurder identifiseer 'n eis binne 'n token is wat jy nog nie geverifieer het nie.
Ons het 'n handtekening-kontrolerende toelatingswebhook by ons Kubernetes-kluster gevoeg sodat ongetekende beelde nooit kon loop nie. 'n Paar uur later het een Deployment 2 242 ReplicaSets gehad, 'n nuwe een elke drie sekondes, en geen beskikbare pods nie. Die webhook se logs het gewys dat dit elke enkele versoek toelaat. Die skade het gekom van die een woord in "mutating admission webhook" wat ons opgehou lees het.
'n Terugkerende gebruiker het elke keer presies tien sekondes na "Laai tans…" gekyk voor aanmelding verskyn het. Die ronde getal was die verklikker: ons SSO-biblioteek het 'n verborge stil-hernuwing-iframe teen 'n auth-gasheer met X-Frame-Options: DENY en frame-ancestors 'none' oopgemaak, so die raam het nooit gelaai of gefouteer nie en die biblioteek het sy volle tydvertraging uitgewag. Klikkaping-verdediging en OIDC-stilhernuwing het in die naat gehang.
Ons het elke e-posadres in rus geënkripteer, en die admin-soekkassie het stilweg opgehou outovoltooi: geen fout, geen loglyn nie. 'n Blind index herstel presiese-passing-opsoek oor syferteks, maar HMAC se hele taak is om die ordening te vernietig wat voorvoegsel-soektog nodig het. Hier is die ontwerp wat vooruit-tik teruggebring het (indekseer elke voorvoegsel as sy eie waarde) en die drie strikke wat ons geleer het dat deursoekbare enkripsie 'n stelselprobleem is, nie 'n kriptoprobleem nie.
Ons het JWT-ondertekening van RS256 na ES256 geskuif, en elke token wat ons gemunt het was kriptografies geldig, en tog verwerp. Drie keer, om drie verskillende redes: DER waar JWS rou R‖S verwag, heelgetal-opvulling wat een token uit 128 laat faal, en 'n base64-dialek wat onder ons voete verander het. Hier is hoe om die verknoeide grepe te lees en die skuldige laag net uit die handtekeninglengte te identifiseer.
Die twee dokumente wat 'n diens lees om een van ons JWTs te valideer — die discovery-dokument en die JWKS — is die mees-aangevraagde, mins-geheime dinge wat ons bedien, en elke haalversoek het vroeër die hele pad terug na oorsprong gekom. Om hulle op Cloudflare te kas, was die maklike deel. Die moeilike deel is dat 'n verouderde publieke-sleutel-kas nooit 'n geldige token mag verwerp nie, en hier is die rotasie-veilige volgorde wat 'n aggressief-gekaste JWKS veilig maak.
Duende se LITE-vlak is $5,750/yr, maar dit beperk jou tot 2 kliënt-toepassings en lewer glad geen SAML nie. Die oomblik dat jy onderneming-SSO of 'n derde toepassing nodig het, sit jy op STANDARD teen $12,500. 'n Blik op wat Duende werklik 'n regte produk kos, en die kliënt-getal-belasting waarteen niemand jou waarsku nie.
Een private sleutel onderteken elke token wat ons auth-bediener uitreik, en dit het twee keer in sy lewe geskuif: gebore binne die proses, verban na 'n kluis wat dit nie kan verlaat nie, en toe herbore as 'n heeltemal kleiner, vinniger soort sleutel. Elke skuif het op 'n lewende uitreiker met tokens onderweg gebeur. Hier is wat bewaring- en algoritmeveranderinge werklik verg, en die stil regressie wat op 'n 'meer veilige' commit saamgery het.
Jou SP het die assertion se handtekening gevalideer, die sertifikaat vasgepen, en die gebruiker ingeteken. Elke kontrole het geslaag. Tog het ek 'n aanmelding herspeel wat ek 'n uur gelede vasgelê het. Die truuk was nie om die handtekening te breek nie. Dit was om 'n veld te skrap wat die handtekening nooit gedek het nie.
Ons het die tweede faktor op die aanmeldbladsy afgevra en dit nooit weer by die token-endpoint gekontroleer nie. So het 'n geldige wagwoord plus 'n handgewysigde return-URL reguit by MFA verbygestap. Die regstelling, en die reël wat dit ons geleer het: MFA is 'n eienskap van die sessie wat jy uitreik, nie 'n stap in die aanmeldskerm nie.
SCIM is 'n gestandaardiseerde CRUD-API waarvan die belangrikste werkwoord die een is wat 'n oudwerknemer se rekening afskakel. Verskaffers vra $125 per maand per verbinding daarvoor, of parkeer dit in die ondernemingsvlak langs SSO. Hier is wat 'n SCIM-verbinding werklik kos om te bedien, en waarom om vir deprovisionering te vra, is om vir sekuriteit te vra.
Azure Table Storage en DynamoDB het geen uitveemerkers nie, so 'n uitgeveede ry verdwyn eenvoudig, wat beteken jou inkrementele rugsteun sien die uitvee glad nie. Herstel daardie rugsteun en die gebruiker wat jy uitgefaseer het, is terug, met die wagwoord waarvan jy weggeroteer het. Hier is waarom uitvee-aksies eersteklas moet wees, en die een tabel wat hulle so maak.
Ons rate limiter en uitsluit-teller het op die kliënt se IP gesleutel. Agter nginx het daardie IP uit 'n header gekom wat die kliënt self kon stel, so een roterende header het elke request 'n vars IP gegee en elke per-IP-kontrole het omgeval. Die een-reël-spoof, en die regstelling wat op Kubernetes knopiger is as wat dit lyk.
Azure Table Storage gee jou 'n partition key, 'n row key, en amper niks anders nie. Geen joins nie, geen secondary indexes om van te praat nie, geen increment nie. Ons laat in elk geval 'n multi-tenant auth-stelsel daarop loop. Die patrone wat dit laat werk, en wat jy prysgee teenoor SQL.
'n Ongeverifieerde wagwoord-herstel-eindpunt sonder 'n per-e-pos rate limit is nie net jou probleem nie. Rig dit op iemand anders se inkassie en jy het hul herstelvorm in 'n strooiposkanon verander, gefaktureer teen jou stuurder-reputasie. Die oplossing, sonder om te lek watter e-posse rekeninge het.
Die meeste auth-verskaffers span SSO, SCIM, MFA en oudit-logboeke agter 'n Enterprise-plan toe. Ons sit almal daarvan op die $0-vlak. Hier is die eenheidsekonomie wat dit oorleefbaar maak om funksies weg te gee: die muur was nooit funksies nie, dit is aktiewe gebruikers en ondersteuning.
Eenmalige aanmelding beteken om die identiteitsverskaffer te vertrou. Ons het hom met een ding te veel vertrou: ons het terugkerende gefedereerde gebruikers opgelos aan die hand van die e-pos in die bewering, sodat enige verbinding iemand anders se adres kon beweer en op daardie rekening kon beland. Die regstelling was nie meer validering nie. Dit was om die identiteits-aansluitsleutel van e-pos na 'n per-verskaffer subject te verander wat die berend party nie kan vervals nie.
Azure Container Apps het belowe om te keer dat ons betaal vir 'n ledige verifikasiekluster. Ons het die koste van die migrasie bereken en dit gestop, nie oor prys of cold starts nie, maar omdat serverless die enigste getal mis wat 'n leier-verkose verifikasie-backplane werklik benodig.
Die "kenmerkbelasting" as 'n werklike rekening. Drie kopersscenario's (eerste enterprise-transaksie, 'n handvol klante, SSO as basiese vereiste) bereken teen elke verskaffer se openbare tariewe. Plus die stiller bytaks waarvoor niemand jou waarsku nie: om mid-integrasie sonder OAuth-kliënte te beland.
ʼn Drie-replika-tros het aanhoudend met homself verskil. Die oorsaak was in ons eie kode: die eweknie-ontdekkingsroetine het ʼn catch-blok gehad wat ontdekking afgeskakel het wanneer multicast misluk, en op bestuurde Kubernetes misluk multicast altyd. Hier is hoekom ons gossip heeltemal uitgevee het en eerder ʼn leier met ʼn blob lease verkies het, en hoekom ʼn lidmaatskap wat jy in Storage Explorer kan oopmaak beter is as een wat jy moet aflei.
Aanmelding is 'n naweek. Die rekening kom daarna: handtekeningverifikasie, SCIM-de-provisionering, MFA, ouditlogboeke, sleutelrotasie, skendingsaanspreeklikheid, en wagdiens vir 'n vlak-nul-stelsel. 'n Eerlike bou-of-koop, insluitend wanneer bou reg is.
OIDC of SAML? Jy kry selde die keuse. Wat elke protokol is, wanneer elkeen wen, die XML-handtekening-slaggate wat SAML gevaarlik maak om self te bou, en hoekom 'n B2B-produk uiteindelik albei nodig het.
Authagonal se ondersteuningstelsel: kitsboodskappe sonder herlaai, deursigtige tweerigting-KI-vertaling wat vanaf die kliënt se eerste boodskap vasgepen word, en 'n gesprek wat ten volle vertaal bly, selfs per e-pos. Eenvoudig, mooi en werklik in staat.
Twee van ons huurders was stilweg dieselfde huurder: dieselfde databasis, dieselfde token-ondertekeningsleutel, verskillende name. Die oorsaak was 'n een-reël-hulpfunksie wat slugs gesuiwer het deur koppeltekens te verwyder, en so 'n unieke identifiseerder in 'n nie-unieke een verander het. Hier is hoe 'n verlieslike string-transformasie 'n kruis-huurder-oorname geword het, en hoekom ons dit voor jou gevind het.
Ons verkoop verifikasie, en daarom is ons belangrikste toets een wat 'n klant word: 'n enkele Playwright-lopie wat 'n huurder registreer, elke kenmerk konfigureer, 'n werklike toepassing daarop rig, 'n werklike gebruiker met die regte aansprake aanmeld, en dan rugsteun, herstel en homself uitvee. Hoe deeglike end-tot-end-toetsing ons vertroue gegee het om regstreeks te gaan.
Ons personeelkonsole staaf deur Authagonal self, met Entra SSO en SCIM wat die voorsiening doen. Om jou eie klant te wees, bring die randgevalle na vore wat geen toetsstel daaraan dink om te skryf nie. Hier is dié wat saak gemaak het.
Jou Terraform-toestand is 'n volledige kaart van jou wolk plus 'n hoop geheime, en by verstek leef dit agter 'n publieke eindpunt. Hier is hoe ons afgeleë toestand van nuuts af opgestart het, dit agter 'n privaat eindpunt geplaas het, en dit deur 'n zero-trust-koppelaar bereik het in plaas daarvan om die VPN-gateway-belasting te betaal, sonder om onsself ooit uit te sluit.
"Almal stel hul wagwoord terug" is 'n migrasiekeuse, nie 'n wet van die fisika nie. Hoe om jou gebruikers se bestaande wagwoord-hutswaardes oor 'n identiteitsverskaffer-skuif te dra sodat die oorskakeling onsigbaar is, en die een geval waar jy regtig nie kan nie.
Die auth-bedryf meet toestemming, nie koste nie. Dit sluit SSO, MFA en voorsiening agter vlakke en per-verbinding-fooie toe vir kenmerke wat feitlik niks kos om te lewer nie. Hier is die onderskeid wat prysbladsye hoop jy nooit sal tref nie.
Om van self-gehoste Duende IdentityServer na bestuurde verifikasie te skuif — wat werklik migreer vanaf die SQL-konfigurasie en ASP.NET Identity, en die bedryfskoste wat jy ophou dra.
ʼn Praktiese blik op wat ʼn Auth0-migrasie werklik behels: wat maklik is, wat lastig is, en die een ding wat Auth0 werklik nie vir jou sal gee nie.