Tobias Looker
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # OpenID Self Issued Provider The Self-Issued OpenID provider (SIOP) chapter of OpenID Connect core sets out a way in which a modified and constrained version of the OpenID Connect protocol can be used for a relying party to contact a special kind of OpenID Connect provider called a SIOP. Consequently because the chapter defines a request that does not conform to a traditional OpenID connect request, it is difficult to reconcile how a self-issued provider could fit into the greater and existing OpenID Connect landscape. This document aims to discuss an alternative approach to SIOP, where instead the capability for an OpenID Provider to issue self-issued responses is treated as an extension of the core OpenID Connect protocol, therefore maintaining backwards compatibility and improving the prospects for the specification to be adopted by existing deployments. In general to-date the concepts that the Self-Issued OpenID provider chapter aims to deal with can be organised into the following: 1. Self Issued Responses 3. Solving the NASCAR problem 4. Request bound client registration 5. Dealing with different OpenID providers deployment architectures Conceptually it's important to distinguish these as seperate issues from the outset as there maybe multiple solutions to each problem. Below is some suggested solutions if we took the above concepts and dealt with them as seperate issues and whilst maintaining compatibility with OpenID Connect Core. # Self Issued Responses ## Requesting a self signed response A client making an OpenID connect request can advertise its support for "self issued responses" through supplying the additional request information. siop_uris A space seperated string denoting the URI types that the OpenID provider supports. The following is a non-normative example of an OpenID Connect request whereby the client is expressing support for self issued responses ``` HTTP/1.1 302 Found Location: https://wallet.example.com/authorize? response_type=id_token &scope=openid%20profile &client_id=s6BhdRkqt3 &state=af0ifjsldkj &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb &siop_uris=did%3Aion%3A%20did%3Aelem%3A%20 ``` ## OpenID Provider Discovery An OpenID Provider who wishes to advertise their support for self issued responses can include the following metadata in their OpenID Connect Metadata siop_supported Boolean value indicating that the OpenID provider supports self-issued responses siop_uris_supported A JSON array of strings representing the URI types that the OpenID provider supports. The following is a non-normative example of the relevant entries in the openid-configuration meta data for an OpenID Provider supporting self issued responses ``` { "siop_supported": true, "siop_uris_support": [ "did:ion:", "did:elem:", "did:sov:" ] } ``` ## Self Issued Response Ideas/Questions - sub claim has to be a valid uri in a SIOP response - Default behaviour is sub_jwk as per current spec where the thumbprint is formated into a URN e.g `urn:jwk_thum:NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs` - An extension point exists where other subject identifier URI types can be used e.g decentralized identifiers - We could look to embedded an authentication assertion that is from OP into the SIOP response so that the current OpenID provider security model holds up? - What do we want to do with the `iss` field, currently it is used for relying parties to detect the id_token is a self issued one and hence apply the required validation rules, however using `https://self-issued.me` is problematic because of the statically hosted openid metadata. ``` { "sub": "urn:jwk_thum:NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs", "provider_assertion": "rtwr.wrtw.wrtbr" <= ES "aud": "https://client.example.org/cb", "nonce": "n-0S6_WzA2Mj", "exp": 1311281970, "iat": 1311280970, "sub_jwk": { "kty":"RSA", "n": "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx 4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMs tn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2 QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbI SD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqb w0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw", "e":"AQAB" } } ``` Response with DID ``` { <- Signed by the provided "iss": "https://provider.example.com", "sub": "did:example:1234", "sub_assertion": "<jwt>", <- Signed by did:example:1234 "aud": "https://client.example.org/cb", "nonce": "n-0S6_WzA2Mj", "exp": 1311281970, "iat": 1311280970 } ``` # Solving the NASCAR problem > Using something like a native browser feature or a custom URL scheme to prevent the need for the relying party to feature all of their supported login providers on their login screen. # Request bound client registration > When dynamic client registration is not an option usually because of the OpenID providers deployment architecture # Dealing with different OpenID providers deployment architectures > Related to above when the OpenID Provider is not a http(s) accessible web server and instead is invoked via a universal link or is a locally running SPA # OpenID Provider Attestation Because the signing mechanism in SIOP is asserting control over the subject identifier rather than the provider attesting to the occurance of an authentication event, there must be an alternative way to express this. WebAuthn has a similar concept known as Authenticator Attestation, which allows a relying party to know properties about the authenticator that was used e.g the vendor of the authenticator. SIOP is attempting to do something similar, where from a vendor perspective there might be a single provider, but many distributed instances of that provider running as mobile apps, PWA's or as a browser extension. // `id_token` -> signed by the provider Example SIOP response Payload ``` { "iss": "https://provider.example.com", "sub": "did:example:1234", "aud": "https://client.example.org/cb", "nonce": "n-0S6_WzA2Mj", "exp": 1311281970, "iat": 1311280970 } ``` # Self Issued Responses supported via an extension to `subject_types` Torsten suggested, maybe instead `identity_types`? As per [chapter 8](https://openid.net/specs/openid-connect-core-1_0.html#SubjectIDTypes) two types of subject identifiers are supported, what if we used this as the basis for a SIOP response? OpenID providers could advertise support for basic self issued subject identifiers via a new subject_type of `jwkthumb` JWK Thumbprint Subject Identifier Type. When this subject identifier type is used, the `sub` value MUST be a JSON Web Key fingerprint (as per spec...) of an asymmetric key pair. When this subject identifier type is used in an `id_token` it MUST be accompanied with a `sub_asrt` claim, where the value equals a JWT signed by the key pair represented by the fingerprint in the `sub` value. `did` Decentralized Identifier Type. When this subject identifier type is used the `sub` value MUST be a Decentralized Identifier. When this subject identifier type is used in an `id_token` it MUST be accompanied with a `sub_asrt` claim, where the value equals a JWT signed by a key pair that is associated to the Decentralized Identifier present in the `sub` field. Example request where a client is expressing support for these subject types ``` HTTP/1.1 302 Found Location: https://provider.example.com/authorize? response_type=id_token &scope=openid%20profile &client_id=s6BhdRkqt3 &state=af0ifjsldkj &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb &subject_types=jwkthumb%20did%3Aion%3A%20did%3Aelem%3A%20 ``` Ordinary OpenID Provider ``` signed by provider.example.com { "iss": "https://provider.example.com", + "sub": "123456789", "aud": "https://www.faber.org/cb", "nonce": "n-0S6_WzA2Mj", "exp": 1311281970, "iat": 1311280970 } ``` ``` signed by provider.example.com { "iss": "https://provider.example2.com", + "sub": "123456789", "aud": "https://www.faber.org/cb", "nonce": "n-0S6_WzA2Mj", "exp": 1311281970, "iat": 1311280970 } ``` Example 1 `sub` as did ``` signed by provider.example.com { "iss": "https://provider.example.com", "sub": "did:example:1234", "sub_asrt": "<jwt-signed-by-key-material-associated-to-sub>", "aud": "https://client.example.org/cb", "nonce": "n-0S6_WzA2Mj", "exp": 1311281970, "iat": 1311280970 } ``` Example 2 using the subject identifiers draft ``` signed by provider.example.com { "iss": "https://provider.example.com", "sub": "123456789", "sub_id": { "subject_type": "did", "phone_number": "did:example:1234", "sub_asrt": "<jwt-signed-by-key-material-associated-to-sub>" }, "aud": "https://client.example.org/cb", "nonce": "n-0S6_WzA2Mj", "exp": 1311281970, "iat": 1311280970 } ``` Example of a provider expressing support in their OpenID Connect Metadata endpoint ``` { "subject_types_supported": [ "public", "pairwise", "jwkthumb", "did:ion:", "did:key:" ] } ``` Outstanding question, what does the provider sign with when it is a PWA? Some form of delegated assertion like how FIDO does group attestations or more exotic crypto like ECDAA. # Notes about IDP vs IDSP The term identity provider today is used to describe a service (or a group of services) that are providing an end-user with an identity within a domain, protocols like OpenID Connect then also allow for this domain bound identity to be relied upon outside of the domain which is often refered to as federated identity. The problem with this architecture and terminology is that the identity becomes entirely bound to the service providing it (the IDP). Instead ideally, identities or more over the identifiers that an identity is oftened centered around should be portable, in otherwords end-users should be afforded the ability to change the service provider for an identity without repercussion. To do this, there needs to some mechanism underwhich ownership over an identifier can be established that does not require a tight coupling to the provider and asymmetric cryptography alone enables such a phenomena. .... Having the ability to `import` an identity into a provider fundamentally makes us questions the language of IDP because the provider is no longer asserting an end-users identity within a domain but merely providing services to enable the end-user to use that identity with whichever relying party it so chooses. Hence the terminology of Identity Service Provider (IDSP). # Naming ideas - Self Issued OpenID Provider is like BYOID (Bring your own ID) - Portable Identifiers # Claims provider integration This ASCI art is a W.I.P ``` +--------+ +----------+ +--------+ | |------(1) OpenID Request---------->| | | | | | | |----------------(1) OpenID Request--------------------->| | | | | | | | | | | | +--------+ | | | | | | | | | | | | | | | End- | | | | Client | | OP |<--(2) AuthN & AuthZ-->| User |<--(2) AuthN & AuthZ-->| Claim | |(Relying| | (SIOP) | | | |Provider| | Party) | | | *--------* | (OP) | | | | | | | | | | |<--------------(3) OpenID Response----------------------| | | |<-----(3) OpenID Response----------| | | | | | | | | | +--------+ +----------+ +--------+ ```

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully