{"record":{"id":"03bbcae95c62b779","repo":"dotnet/aspnetcore","slug":"some-passkey-features-are-missing-please-update-y","errorCode":null,"errorMessage":"Some passkey features are missing. Please update your browser.","messagePattern":"Some passkey features are missing\\. Please update your browser\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Shared/PasskeySubmit.razor.js","lineNumber":67,"sourceCode":"        };\n\n        this.internals.form.addEventListener('submit', (event) => {\n            if (event.submitter?.name === '__passkeySubmit') {\n                event.preventDefault();\n                this.obtainAndSubmitCredential();\n            }\n        });\n\n        this.tryAutofillPasskey();\n    }\n\n    disconnectedCallback() {\n        this.abortController?.abort();\n    }\n\n    async obtainCredential(useConditionalMediation, signal) {\n        if (!browserSupportsPasskeys) {\n            throw new Error('Some passkey features are missing. Please update your browser.');\n        }\n\n        if (this.attrs.operation === 'Create') {\n            return await createCredential(signal);\n        } else if (this.attrs.operation === 'Request') {\n            const email = new FormData(this.internals.form).get(this.attrs.emailName);\n            const mediation = useConditionalMediation ? 'conditional' : undefined;\n            return await requestCredential(email, mediation, signal);\n        } else {\n            throw new Error(`Unknown passkey operation '${this.attrs.operation}'.`);\n        }\n    }\n\n    async obtainAndSubmitCredential(useConditionalMediation = false) {\n        this.abortController?.abort();\n        this.abortController = new AbortController();\n        const signal = this.abortController.signal;\n        const formData = new FormData();","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/dotnet/aspnetcore/blob/294cab2f9b2e03af6b953820c7ab497c3c8b7ad9/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Shared/PasskeySubmit.razor.js#L49-L85","documentation":"Thrown by obtainCredential when browserSupportsPasskeys is false. The feature gate (PasskeySubmit.razor.js:1-5) requires navigator.credentials, window.PublicKeyCredential, AND the parseCreationOptionsFromJSON / parseRequestOptionsFromJSON methods. Missing any means the browser cannot do modern passkey (conditional mediation, JSON option parsing) flows this component relies on.","triggerScenarios":"User on an older or non-Chromium browser (old Safari/Firefox); a browser that supports WebAuthn basics but not the JSON-parse helpers (added later); embedded WebView with restricted APIs; running the component in a headless/automated browser without WebAuthn.","commonSituations":"Enterprise locked to an older browser; iOS < 16 / macOS < 13; embedded WebViews (older Electron, older Android WebView); CI/automation without virtual authenticator support.","solutions":["Surface a user-facing message prompting a browser/OS update; offer a password fallback.","Feature-detect before rendering the passkey-submit element and render a fallback UI when unsupported.","Recommend a supported browser (recent Chrome/Edge/Safari/Firefox) with platform authenticator available.","In automation, enable a virtual authenticator."],"exampleFix":"// before\n// always render <passkey-submit> regardless of support\n\n// after\nconst ok = typeof navigator.credentials !== 'undefined' && !!window.PublicKeyCredential?.parseCreationOptionsFromJSON;\nif (ok) { /* render passkey-submit */ } else { /* render password form + upgrade notice */ }","handlingStrategy":"validation","validationCode":"const passkeysSupported =\n  typeof navigator.credentials !== 'undefined' &&\n  typeof window.PublicKeyCredential !== 'undefined' &&\n  typeof window.PublicKeyCredential.parseCreationOptionsFromJSON === 'function' &&\n  typeof window.PublicKeyCredential.parseRequestOptionsFromJSON === 'function';","typeGuard":"function supportsPasskeys(): boolean {\n  return typeof navigator !== 'undefined' && 'credentials' in navigator\n    && typeof PublicKeyCredential !== 'undefined'\n    && typeof PublicKeyCredential.parseCreationOptionsFromJSON === 'function';\n}","tryCatchPattern":"null","preventionTips":["Feature-detect before rendering the passkey UI.","Provide a password fallback for unsupported browsers.","Prompt users on old browsers/OS to upgrade."],"tags":["blazor","passkeys","webauthn","browser-support","feature-detection"],"analyzedSha":"294cab2f9b2e03af6b953820c7ab497c3c8b7ad9","analyzedAt":"2026-08-06T20:08:02.189Z","schemaVersion":2},"datasetVersion":"2026-08-06T23:17:07.152Z"}