Skip to content

feat: initialise Solid26 implementors guide#776

Draft
jeswr wants to merge 45 commits intomainfrom
solid26
Draft

feat: initialise Solid26 implementors guide#776
jeswr wants to merge 45 commits intomainfrom
solid26

Conversation

@jeswr
Copy link
Copy Markdown
Member

@jeswr jeswr commented Apr 5, 2026

This is the beginning of the implementors guide discussed in #773 - currently it just fixes the specs and versions to be included.

Additional specs such as #774 (which I acknowledge I still owe a response to) may be added to this guide if developed and CG endorsed in time.

A preview link can be found here.

EDIT since there is a lot of active editing on this PR -- I am marking comments as resolved as I implement changes to ease navigation (cc @csarven @elf-pavlik - I hope this is ok, as far as I understand anyone with read access can still expand and read the content as they desire).

csarven

This comment was marked as resolved.

@elf-pavlik

This comment was marked as resolved.

@csarven

This comment was marked as resolved.

@elf-pavlik

This comment was marked as resolved.

@jeswr

This comment was marked as resolved.

@elf-pavlik

This comment was marked as resolved.

@csarven

This comment was marked as resolved.

@jeswr

This comment was marked as resolved.

@jeswr

This comment was marked as resolved.

Comment thread solid26.html Outdated
Comment thread solid26.html
@elf-pavlik
Copy link
Copy Markdown
Member

I think this is a good focus and the suggested signposting belongs in a separate document.

Fine with me, can we already start that separate document? Will Solid 26 manifest in just those two documents or there are going to be more of them?

@csarven
Copy link
Copy Markdown
Member

csarven commented Apr 8, 2026

Should solid26 recommend more items from https://solidproject.org/TR/ to give a fair representation of what is relatively widely implemented and deployed?

For instance, taking the data from https://jeff-zucker.github.io/solid-load-profile/ as one source of input, we can infer what's out there in the ecosystem and use that for the implementers guide. I'll let the group be the judge of how to make a cut (e.g., based on count or other criteria) for what's reasonably deployed. I think it is hard to argue against the fact that Solid WebID Profile and Solid Type Indexes are used out there. If solid26 doesn't suggest anything beyond a WebID, it downplays personalisation and the social aspect of Solid, and if anything, looks strange for the state of things in 2026.

If there is other concrete data on the ecosystem, let's have a look.

@csarven

This comment was marked as resolved.

@csarven
Copy link
Copy Markdown
Member

csarven commented Apr 8, 2026

There should be a general recommendation that latest published versions of specifications should be used. That could be expressed along the lines of: at the time of this publication we recommend x but implementers are strongly encouraged to use latest published when available, and if you like to live on the bleeding edge, use the editor's draft.

On that last note, solid26 should also take the opportunity to thank implementers (somewhere upfront like in the Introduction) for helping to improve the Solid ecosystem, and any feedback on their implementation experience in meetings, issues etc., would be most appreciated.

Comment thread solid26.html Outdated
Comment thread solid26.html Outdated
Comment thread solid26.html Outdated
uvdsl and others added 2 commits April 20, 2026 17:54
Co-authored-by: Tobias Käfer <6708974+kaefer3000@users.noreply.github.com>
* feat: boostrap webid section

* feat: enhance Solid26 guidance sections

* fix section headings

* feat: enhance WebID Profile guidance with additional validation notes and refined predicate listings

* feat: update WebID Profile note to include empirical data source for predicate usage

* feat: add clarification on non-public WebID Document retrieval in WebID Profile

* minor editorial

* chore: consistency of term "Implementors Guide" with main PR

Co-authored-by: Christoph Braun <braun@kit.edu>

* fix foaf predicate and note on solid:oidcIssuer

* Update solid26.html

Co-authored-by: Christoph Braun <christoph.braun@protonmail.com>

* Add Linked Data Notifications inbox reference to WebID Profile

* Update WebID Document union process to mention ldp:inbox in discovery predicates

* remove use case specificity on authenticated webid

Co-authored-by: Christoph Braun <christoph.braun@protonmail.com>

* Remove non-normative reference to Solid WebID Profile in comments

* Update solid26.html

Co-authored-by: Christoph Braun <christoph.braun@protonmail.com>

* chore: remove mention of profile shapes

Co-authored-by: Christoph Braun <christoph.braun@protonmail.com>

* Tighten WebID term definitions in §3.1

Use "HTTP URI" for the WebID definition to match the normative
section. Drop "Web resource" (not an established term) and the
"Generally public / permissioned" hedging; state the auth property
precisely where it matters.

* Bound Extended Profile Document traversal in assembly algorithm

Replace "transitively from the Preferences Document" recursion with
an explicit, bounded traversal: one level from Extended Profile
Documents linked directly off the WebID Document; no further
traversal from Preferences-linked or Type-Index-linked documents.

Introduce "discovery links" as a shorthand for
rdfs:seeAlso / foaf:isPrimaryTopicOf / owl:sameAs and reuse it
throughout §3.1.2 and §3.1.3. Add a note explaining why one level
of traversal is needed when the WebID Document is not itself in
Solid storage.

* Drop 'publicly readable' qualifier in assembly step 1

Visibility of the WebID Document is covered in §3.1.2. Step 1 only
needs to surface an error when retrieval fails.

* Recommend an editable Extended Profile Document when WebID is not in Solid storage

Address the case where the WebID Document itself cannot be modified
by Solid clients: advise linking an Extended Profile Document in
a Solid storage so clients have a writable attachment point for
profile statements.

* Require both text/turtle and application/ld+json for WebID Profile Document

Align with Solid WebID Profile §3.1 Reading Profile, which extends
WebID 1.0's Turtle-only requirement to include JSON-LD.

* Refresh profile-editor list: drop PodBrowser, add dokieli

PodBrowser is no longer actively maintained; dokieli is a
widely-used reader/writer of agent profiles.

* Clarify the predicate list ordering is advisory

Make the reader/writer contract explicit: readers should accept any
of the listed predicates as equivalent for a given field; writers
typically commit to one. The stated order is a suggested preference
and may vary by the ecosystem an application integrates with.

* Drop unused [BIO] reference

[BIO] was listed in §References but never cited in the document.

* Surface error when WebID lacks solid:oidcIssuer

A WebID without an oidcIssuer cannot authenticate via Solid-OIDC;
clients should tell the user rather than failing opaquely further
into the login flow.

* Call out that missing Preferences/Type Index documents are not errors

Not all WebIDs link a Preferences Document or Type Index documents;
clients should skip their fetch silently rather than fail.

* Use 'set union' in WebID Profile definition and assembly algorithm

* Replace document-level self-describing filter with spec-aligned statement filter

The earlier document-level 'self-describing' filter was a
solid26-specific precaution not present in Solid WebID Profile. The
current spec (§2 Discovery) states the profile is assembled by
collecting statements with the WebID as subject or object. Drop the
document-level filter; keep the statement-level filter and reword
step 6 positively to match the spec.

Also collapses §3.1.2 from two caveats to one (solid:oidcIssuer
origin) and removes the now-obsolete step 4 in §3.1.3 — which means
the 'switch steps 3 and 4' and 'explain step 4 better' colleague
asks dissolve naturally.

* Note the range of data-discovery mechanisms beyond the profile

Client-side data discovery varies across the ecosystem; list the
common mechanisms (Type Indexes, SAI, SPARQL / Quad Pattern
Fragments endpoints, fixed paths under storage root, DCAT) without
prescribing one.

* Add §3.1.4 Security Considerations for solid:oidcIssuer protection

Solid WebID Profile §Protected properties requires servers to
protect solid:oidcIssuer triples, but no known Solid server
implements this at time of publication; flag the implication for
implementers in an informational subsection.

* Remove references to WebID Profile SHACL shapes

Drop the shape-validation note in §3.1.3, the profile-shapes.ttl
reference and dagger markers in §4, and the companion 'not in the
shape' annotation. Shape documentation belongs in the WebID Profile
repo, not in this implementation guide.

* Soften predicate-list framing to 'fallbacks to consider'

Drop the SHOULD-accept-as-equivalent normative framing; present the
list as optional fallbacks applications may consider.

* Refresh predicate list from dokieli and SolidOS profile renderers

Derive the fallback ordering from what dokieli and SolidOS profile-pane
actually read: flip Name to foaf:name-first, broaden Avatar to the
full dokieli chain, add social accounts, schema:hasOccupation,
cco:skill, vcard:language, solid:preferredLanguage, schema:knows,
vcard:url. Pull ActivityStreams and SIOC into the referenced
vocabularies.

* Drop section numbers from external spec references

Per csarven (PR #781) and jeswr's agreement: section numbers in
referenced specs are not reliable across snapshots. Keep link text
as the section title only; internal cross-references within this
document keep their numbers.

* Language pass on §3.1 WebID: tighten prose, fix Implementors typo

Remove duplicated and filler phrasing across §3.1:
- Intro lists subsections (incl. new §3.1.4) without restating them.
- Term-dl header: 'For the purposes of this section' dropped.
- Fix 'Implementors Guide' typo in §3.1.1 heading.
- Compact '?webid ?p ?o, where ?webid is the WebID and each ?iss is…'
  patterns to one statement-form with inline angle-bracket terms.
- Drop '(e.g. a person)' filler.
- Collapse 'MAY be hosted anywhere; it MAY, but need not, reside…' to
  single clause.
- Tighten the Profile Document URI-resolution sentence, and
  several notes / algorithm steps that repeated 'Extended Profile
  Document' / 'Solid WebID Profile' within the same sentence.

* Soften security-note framing and restore absent-link prose

Use 'Not all Solid servers implement this protection' rather than
'No known Solid server', and restore the fuller wording about
Preferences/Type Index documents being absent.

* Replace numeric section refs with names; say 'set union of statements'

Inline section names as link text instead of '§ 3.1.1' / '§ 3.1.3'
style refs; reads naturally without relying on the TOC numbering.
Both 'set union' occurrences now read 'set union of statements'
to make the RDF-graph semantics explicit.

* Drop the 'pinned specifications' framing

Per csarven: framing certain specs as 'pinned' reads as gatekeeping
and adds no value for the reader. Rephrase the §3.1 intro so
requirements and common assumptions are stated as drawn from the
Solid26 Implementation Guide specifications, and trim the §3.1.2
sub-bullet to 'These specifications do not preclude...'.

* Extend WebID Profile definition to match algorithm sources

The assembly algorithm unions statements from the Preferences
Document and Type Index documents as well as Extended Profile
Documents; the term definition now names all four sources.

---------

Co-authored-by: Christoph Braun <christoph.braun@protonmail.com>
Co-authored-by: Christoph Braun <braun@kit.edu>
@jeswr jeswr mentioned this pull request Apr 24, 2026
jeswr added 3 commits April 24, 2026 02:20
Per @csarven (#776 thread on line 386): the full step-by-step flow
and the strong/weak ETag footnote were replaying RFC 9110 rather
than guiding. Collapse to one paragraph that states the problem,
names the mechanism, and points at W3C Editing the Web and
RFC 9110 § Validator Fields.
The third outer bullet had a <p> that was never closed before an
inner <ul> (invalid: <p> cannot contain block-level content), and a
trailing orphan </p> after the outer </ul>. Close the paragraph
before the list and drop the orphan. Addresses @TallTed (#776
thread on line 372).
Collect known security/privacy limitations across the pinned specs
into a new top-level section with six subsections:

- §5.1 WebID Profile Integrity (absorbs the former §3.1.4 on
  solid:oidcIssuer write-protection; adds WebID 1.0 §Security
  Considerations on profile-document integrity and the Solid-OIDC
  guidance that the RDF body is canonical for issuer discovery).
- §5.2 Application Authorization (addresses @elf-pavlik
  #4276686814: WAC/ACP authorize agents not applications, Origin
  is not client identification, ACP Client-matcher limits).
- §5.3 Access Control Leakage (WAC-documented leakage via
  Location, DELETE/PATCH status codes, lack of mandated audit
  trails).
- §5.4 Personal Data in Access Control and Preferences (WAC PII
  transitive to acl:Control holders; Preferences Documents hold
  private data with protection delegated to WAC/ACP).
- §5.5 Client Identity and Trust (Solid-OIDC §Out of Scope,
  §Client Secrets in browser SPAs).
- §5.6 Profile and Storage Discoverability (Solid Protocol
  §Privacy Considerations; WebID 1.0 absence of privacy section).

The new section explicitly notes it was drafted with generative-AI
assistance to kickstart coverage and that community review is
expected. Update §3.1 intro and TOC accordingly: §3.1.4 gone,
new §5 + subsections added.
@jeswr
Copy link
Copy Markdown
Member Author

jeswr commented Apr 24, 2026

This guide should include some basic security & privacy considerations.

Done in 7be1a87 — new §5 Security and Privacy Considerations with six subsections sourced from the pinned specs. @elf-pavlik Your two points are in §5.2 Application Authorization (WAC has no app-constraint mechanism, Origin isn't client identification; ACP Client matcher has limited coverage in practice, with your video linked). Section flagged as AI-drafted for kickstart; please flag anything to expand or soften.

Previous draft had six subsections and fifteen bullets that were
overkill for the guide's scale. Collapse to a single flat list of
the four points implementers most need to know:

- WebID integrity (solid:oidcIssuer server protection)
- Authorization authorizes agents, not applications
- Consent transitivity in access control
- Client identity / no-secrets-in-SPA

Drop the WAC leakage subsection, Preferences delegation bullet,
profile-discoverability subsection, and the header-vs-body
spoofing footnote — these are real but niche, and their spec
citations give implementers a pointer if they need them. TOC
simplified accordingly: §5 has no subsection entries.
Comment thread solid26.html
<li><strong>WebID integrity.</strong> The meaning of a WebID depends on the integrity of its Profile Document. <cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#protected-properties">Protected properties</a> requires servers to protect <code>solid:oidcIssuer</code> triples from non-owner modification; not all servers do, and on such a server any agent with write access to the document can change the issuer.</li>
<li><strong>Authorization authorizes agents, not applications.</strong> WAC and ACP both grant access to the agent (WebID) behind a request. Any application acting as that agent inherits its access. WAC has no mechanism to constrain by application; ACP's <code>Client</code> matcher has limited practical coverage (<a href="https://youtu.be/5Q1nUmGdaXE">demonstration</a>). CG work on conditional grants is in progress.</li>
<li><strong>Consent transitivity in access control.</strong> Access-control and group resources can themselves carry personal data. Any agent with <code>acl:Control</code> on such a resource can read that data; consent to include someone in an ACL is transitive to every Control holder [<cite><a class="bibref" href="#ref-wac">WAC</a></cite> § <a href="https://solidproject.org/TR/2024/wac-20240512#security-privacy-review">Security and Privacy Review</a>].</li>
<li><strong>Client identity.</strong> Solid-OIDC has no mechanism for strongly-asserted client identity, and browser-based clients cannot hold client secrets. Authorization Servers treat anonymous clients with low-trust policies; confidential-client protections are unavailable in typical SPA deployments [<cite><a class="bibref" href="#ref-solid-oidc">Solid-OIDC</a></cite> § <a href="https://solidproject.org/TR/2022/oidc-20220328#out-of-scope">Out of Scope</a>, § <a href="https://solidproject.org/TR/2022/oidc-20220328#client-secrets">Client Secrets</a>].</li>
Copy link
Copy Markdown
Member

@elf-pavlik elf-pavlik Apr 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what do you mean by anonymous clients. Leaving aside dynamic registration, which OIDC Provider is not required to support, provider/issuer verifies cilent identity by checking redirect_uris in Client ID Document. Authorization Server / Resource Server relies on what issuer asserted, so unless issuer is restricted in access policy end user could technically set any client id they want. With token exchange / UMA, there could be client authentication on token endpoint, for example using JWT assertion. This would not work for public clients, but traditional web apps (with backend) which are confidential clients could authenticate themself properly.
There is a broader issue when authorization sets client condition/matcher, who is allowed to assert it after some verification, options are.

  • end user's issuer - technically end-user could set any client id they want
  • resource owner issuer, so besides client condition/matcher there would also be issuer condition/matcher
  • authorization server - possible with token exchange / UMA and confidential clients, client id asserted by the issuer wouldn't need to be relied owner

LWS should do proper threat modeling that would take all such variants into consideration.

Comment thread solid26.html
</p>
<p>
Implementers of Clients are advised to consider whether their Client implementation should actually attempt to modify access rules at all:
An architectural separation between a Client executing application-specific logic and a Client executing authorization-related logic might be beneficial in terms of separation of concerns, maintainability, and re-usability of software components [<a href="#ref-authapp">BKY+24</a>].
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SAI Authorization Agent is another example. I have old demo where user can select resource in the app and get redirected to authorization agent to share access to that resource with other's in user's social graph.

Copy link
Copy Markdown
Member

@elf-pavlik elf-pavlik Apr 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another flow I want to implement would use access request and either

Comment thread solid26.html
</div>

<ul>
<li><strong>WebID integrity.</strong> The meaning of a WebID depends on the integrity of its Profile Document. <cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#protected-properties">Protected properties</a> requires servers to protect <code>solid:oidcIssuer</code> triples from non-owner modification; not all servers do, and on such a server any agent with write access to the document can change the issuer.</li>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is negative information. The encouragement for implementers should be about taking care of this or the next steps. Literally encourage existing or new servers to do something here, and not just complain.

Once again:

if we are dropping down to this level of scrutiny, because some deem it to be a necessary criterion of sorts, then we should certainly apply that consistently across every specification mentioned in solid26, including those that do not have significant uptake, and whether each feature in their specification has a test and a publicly verifiable implementation implementing it. If not, there should be strong advisory against using those specifications.

#781 (comment)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that suggestion does improve.

Comment thread solid26.html

<ul>
<li><strong>WebID integrity.</strong> The meaning of a WebID depends on the integrity of its Profile Document. <cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#protected-properties">Protected properties</a> requires servers to protect <code>solid:oidcIssuer</code> triples from non-owner modification; not all servers do, and on such a server any agent with write access to the document can change the issuer.</li>
<li><strong>Authorization authorizes agents, not applications.</strong> WAC and ACP both grant access to the agent (WebID) behind a request. Any application acting as that agent inherits its access. WAC has no mechanism to constrain by application; ACP's <code>Client</code> matcher has limited practical coverage (<a href="https://youtu.be/5Q1nUmGdaXE">demonstration</a>). CG work on conditional grants is in progress.</li>
Copy link
Copy Markdown
Member

@csarven csarven Apr 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once again, this is undermining/underselling WAC. Are you aware that the conditions feature (including the possibility to indicated clients and issuers) is now in WAC ED: https://solid.github.io/web-access-control-spec/

All we are waiting for is some implementations before it is part of TR/wac . @uvdsl and I are working on separate implementations.

So, it is not unimaginable that what's written will be obsolete will probably be outdated by the time this document is published. Perhaps worth reflecting on that.

See also #783 (review)

Comment thread solid26.html
</div>

<ul>
<li><strong>WebID integrity.</strong> The meaning of a WebID depends on the integrity of its Profile Document. <cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#protected-properties">Protected properties</a> requires servers to protect <code>solid:oidcIssuer</code> triples from non-owner modification; not all servers do, and on such a server any agent with write access to the document can change the issuer.</li>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The meaning depending on the "integrity" of its Profile Document doesn't really say anything deep or useful to the implementer. At best, it is no different than the URI owner allocating a URI to resource, and describing the resource.

Are you trying to say that when a WebID is hosted by a Solid server its integrity is questioned because it may not be able to protect some statements? So, this is your way of saying don't host your WebID on a Solid server. And also saying Solid doesn't make it possible for people to control their identity online. That seems to run against the fabric of the Solid project.

In any case, this is fixable or can be improved upon. It is fundamentally no different than protecting containment triples (as mentioned in Solid Protocol), or possibly consider looking into alternative authentication mechanisms so we don't need to bother having oidcIssuer in a Solid WebID Profile.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that suggestion does improve.

Comment thread solid26.html
<ul>
<li><strong>WebID integrity.</strong> The meaning of a WebID depends on the integrity of its Profile Document. <cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#protected-properties">Protected properties</a> requires servers to protect <code>solid:oidcIssuer</code> triples from non-owner modification; not all servers do, and on such a server any agent with write access to the document can change the issuer.</li>
<li><strong>Authorization authorizes agents, not applications.</strong> WAC and ACP both grant access to the agent (WebID) behind a request. Any application acting as that agent inherits its access. WAC has no mechanism to constrain by application; ACP's <code>Client</code> matcher has limited practical coverage (<a href="https://youtu.be/5Q1nUmGdaXE">demonstration</a>). CG work on conditional grants is in progress.</li>
<li><strong>Consent transitivity in access control.</strong> Access-control and group resources can themselves carry personal data. Any agent with <code>acl:Control</code> on such a resource can read that data; consent to include someone in an ACL is transitive to every Control holder [<cite><a class="bibref" href="#ref-wac">WAC</a></cite> § <a href="https://solidproject.org/TR/2024/wac-20240512#security-privacy-review">Security and Privacy Review</a>].</li>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That explanation seems inadequate. It seems to cherry pick in such a way as if there is something "bad" about WAC. Here is the full quote from https://solidproject.org/TR/2024/wac-20240512#security-privacy-review-personal-data and it is important to understand what's actually being expressed here. It is trying to be considerate about all sort of things for the implementer in a meaningful way.

ACL resources can contain any data including that which identifies or refers to agents and agent groups. Access to ACL resources is only granted to Access Subjects with the acl:Control access mode, and thus by definition, meaningful consent to any personal data that agents include about themselves is extended to other agents with control access on the ACL resource. Group resources are subject to the same Authorization conditions as any resource (that is not an ACL resource), and thus information could be exposed.

And mind you that WAC at least has a security and privacy considerations section, something ACP does not even have, so its fitness is highly questionable. That should be captured in this section about all sorts of potential problems in ACP. See also #783 (review)

Comment thread solid26.html

<div class="note">
<h4><span>Note</span></h4>
<p>Data discovery beyond the profile varies across the ecosystem. Mechanisms in active use include: Type Indexes; Solid Application Interoperability (SAI); SPARQL or Quad Pattern Fragments endpoints; fixed paths under the root of a storage; and DCAT catalogues. This guide does not prescribe a single mechanism.</p>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While SPARQL or QPF may be used out there, they are not incorporated in the work items listed in https://solidproject.org/TR/ .

If we are going to explain other things that's happening in the ecosystem, then lets bring out the laundry list. I would like us to come back to this point as to what qualifies here and what doesn't.

Comment thread solid26.html
<p>Drafted with generative-AI assistance to kickstart coverage; community review is expected.</p>
</div>

<ul>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One of the points that should be made about Solid-OIDC in the security and privacy section is about third-party issuers. It should address considerations on:

  • What it means for implementers to rely on third-party issuers in the context of Solid promising users to control their identities?

  • The security and privacy risks with regards to many agents using the same issuer, and the danger of that issuer being a single point of failure for all agents using them. So, when the issuer is compromised, this is a massive problem. Attacks tend to focus on major centralisations, so this is a concern for implementations offering multiple accounts. Similarly, the service could perform illegal activities.

Comment thread solid26.html
</div>

<ul>
<li><strong>WebID integrity.</strong> The meaning of a WebID depends on the integrity of its Profile Document. <cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#protected-properties">Protected properties</a> requires servers to protect <code>solid:oidcIssuer</code> triples from non-owner modification; not all servers do, and on such a server any agent with write access to the document can change the issuer.</li>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<li><strong>WebID integrity.</strong> The meaning of a WebID depends on the integrity of its Profile Document. <cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#protected-properties">Protected properties</a> requires servers to protect <code>solid:oidcIssuer</code> triples from non-owner modification; not all servers do, and on such a server any agent with write access to the document can change the issuer.</li>
<li><strong>Protected Properties in WebID Profile Documents.</strong> Servers should protect the § <a href="https://solid.github.io/webid-profile/#protected-properties">Protected properties</a> in a <cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> document such that non-owner agents with write access to the document cannot change the issuer.</li>

...to avoid the word "integrity" and remove the side note about what current servers often do not do.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That works, thanks. Minor: consider replacing "should" with "strongly encouraged".

Copy link
Copy Markdown
Member

@jeff-zucker jeff-zucker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Omit : "Do not traverse further: discovery links in the documents fetched by this step, in extended profiles discovered from the Preferences Document, and in Type Index documents are not followed."

Add : Clients must descend two levels from the WebID document looking for extended profile links and may descend as far as they want. An author who places an extended document link in an extended document linked from the WebID profile should expect that second document to be read by clients. They can not count on links further away being discovered.

Note : I am not adamant about allowing extended document links in the type indexes and preferences file although I can think of many use cases for those. What I am adamant about is the ability to go at least two levels from the WebID document for extended documents other than the Preferences and Type Indexes.

Comment thread solid26.html
<ol>
<li><code>GET</code> the WebID Document. If it cannot be retrieved, surface a clear error.</li>
<li><code>GET</code> each linked document: Extended Profile Documents via <a href="#dfn-discovery-links">discovery links</a>, the Preferences Document via <code>pim:preferencesFile</code>, and Type Index documents via <code>solid:publicTypeIndex</code>/<code>solid:privateTypeIndex</code>. On <code>401</code>/<code>403</code> with a logged-in user, retry authenticated; Preferences and the private Type Index normally require authentication [<cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#discovery">Discovery</a>, § <a href="https://solid.github.io/webid-profile/#private-preferences">Private Preferences</a>]. If the WebID Document does not link a Preferences Document or Type Index documents, those fetches are skipped; their absence is not an error.</li>
<li>For each Extended Profile Document linked directly from the WebID Document, fetch the Extended Profile Documents it links via its <a href="#dfn-discovery-links">discovery links</a>. Do not traverse further: discovery links in the documents fetched by this step, in extended profiles discovered from the Preferences Document, and in Type Index documents are not followed. Use cycle detection so no document is fetched twice.</li>
Copy link
Copy Markdown
Member

@jeff-zucker jeff-zucker Apr 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Line 574 directly contradicts line 565 and line 581 and introduces a much too restrictive set of bounds. The minimum set of bounds is, in my opinion, 2 traversals. This mandates nothing about the writability of any document, only that if there are links in an extended doc to other extended docs we should be expected to follow them at least one level, i.e. two levels from the WebID Document.

Here are two examples of what a limit of one link would prevent

   <WebID1> rdfs:seeAlso <friendsAndFamily.ttl> .
   <friendsAndFamily.ttl> rdfs:seeAlso <familyOnly.ttl> .

When permissioned accordingly, this pattern allows family to see the more general friendsAndFamily data and also the more specific family data, i.e. inheritance. Why would we want to prevent that kind of security structure?

Also prevented by a limit of one

   <WebID1> owl:sameAs <WebID2> .
   <WebID2> rdfs:seeAlso <myCV.ttl> .

With a limit of one, a discovery of WebID1 will not turn up myCV.ttl.

A limit of one greatly limits the freedom of users to partition and control their data.

This limit is in contradiction to the WebID Profile Draft and the drafts which preceded it and is being introduced at the last minute. Either drop the limit entirely or make it two levels.

Comment thread solid26.html

<div class="note">
<h4><span>Note</span></h4>
<p>When the WebID Document is not hosted in Solid storage, clients cannot add new <a href="#dfn-discovery-links">discovery links</a> to it. The one level of traversal from Extended Profile Documents in Solid storage lets a client attach further Extended Profile Documents (for example, at different access levels) via links it can write.</p>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This introduces a completely unnecessary split between types of servers, requiring clients to follow differing expectations. It adds complexity to discovery. It allows the Identity server's decision on storing the WebID to control the ability for discovery on the Resource server and takes capabilities away from WebID owners. Why should we have to tell clients "If you're on server A, do B, but if you're on server C, do D?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, this completely contradicts line 574.

The one level of traversal from Extended Profile Documents in Solid storage lets a client attach further Extended Profile Documents (for example, at different access levels) via links it can write.

No, if clients are only expected to descend one level from the WebID Document this advice is useless since clients will never follow those links.

Comment thread solid26.html
A WebID is an HTTP URI denoting an agent [<cite><a class="bibref" href="#ref-webid">WebID 1.0</a></cite> § <a href="https://www.w3.org/2005/Incubator/webid/spec/identity/#terminology">Terminology</a>].
</li>
<li>
The WebID Profile Document is obtained by dereferencing the WebID HTTP URI: for a WebID with a fragment (e.g. <code>#me</code>), the fragment-less URI identifies it; for a WebID without a fragment, an HTTP <code>GET</code> MUST return <code>303 See Other</code> whose <code>Location</code> identifies it [<cite><a class="bibref" href="#ref-webid">WebID 1.0</a></cite> § <a href="https://www.w3.org/2005/Incubator/webid/spec/identity/#terminology">Terminology</a>, § <a href="https://www.w3.org/2005/Incubator/webid/spec/identity/#the-webid-http-uri">The WebID HTTP URI</a>].
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The WebID Profile Document is obtained by dereferencing the WebID HTTP URI: for a WebID with a fragment (e.g. <code>#me</code>), the fragment-less URI identifies it; for a WebID without a fragment, an HTTP <code>GET</code> MUST return <code>303 See Other</code> whose <code>Location</code> identifies it [<cite><a class="bibref" href="#ref-webid">WebID 1.0</a></cite> § <a href="https://www.w3.org/2005/Incubator/webid/spec/identity/#terminology">Terminology</a>, § <a href="https://www.w3.org/2005/Incubator/webid/spec/identity/#the-webid-http-uri">The WebID HTTP URI</a>].
The WebID Profile Document is obtained by dereferencing the WebID HTTP URI: for a WebID with a fragment (e.g., <code>#me</code>), the fragment-less URI identifies it; for a WebID without a fragment, an HTTP <code>GET</code> MUST return <code>303 See Other</code> whose <code>Location</code> identifies it [<cite><a class="bibref" href="#ref-webid">WebID 1.0</a></cite> § <a href="https://www.w3.org/2005/Incubator/webid/spec/identity/#terminology">Terminology</a>, § <a href="https://www.w3.org/2005/Incubator/webid/spec/identity/#the-webid-http-uri">The WebID HTTP URI</a>].

Comment thread solid26.html
<li><code>GET</code> the WebID Document. If it cannot be retrieved, surface a clear error.</li>
<li><code>GET</code> each linked document: Extended Profile Documents via <a href="#dfn-discovery-links">discovery links</a>, the Preferences Document via <code>pim:preferencesFile</code>, and Type Index documents via <code>solid:publicTypeIndex</code>/<code>solid:privateTypeIndex</code>. On <code>401</code>/<code>403</code> with a logged-in user, retry authenticated; Preferences and the private Type Index normally require authentication [<cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#discovery">Discovery</a>, § <a href="https://solid.github.io/webid-profile/#private-preferences">Private Preferences</a>]. If the WebID Document does not link a Preferences Document or Type Index documents, those fetches are skipped; their absence is not an error.</li>
<li>For each Extended Profile Document linked directly from the WebID Document, fetch the Extended Profile Documents it links via its <a href="#dfn-discovery-links">discovery links</a>. Do not traverse further: discovery links in the documents fetched by this step, in extended profiles discovered from the Preferences Document, and in Type Index documents are not followed. Use cycle detection so no document is fetched twice.</li>
<li>Form the set union of statements from the fetched documents, then drop every <code>solid:oidcIssuer</code> triple that did not originate in the WebID Document: that predicate is authoritative only when sourced there, mirroring the write protection in <cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#updating-profile">Updating Profile</a>. Other discovery predicates (e.g. <code>pim:storage</code>, <code>ldp:inbox</code>) may legitimately appear in any of these documents.</li>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<li>Form the set union of statements from the fetched documents, then drop every <code>solid:oidcIssuer</code> triple that did not originate in the WebID Document: that predicate is authoritative only when sourced there, mirroring the write protection in <cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#updating-profile">Updating Profile</a>. Other discovery predicates (e.g. <code>pim:storage</code>, <code>ldp:inbox</code>) may legitimately appear in any of these documents.</li>
<li>Form the set union of statements from the fetched documents, then drop every <code>solid:oidcIssuer</code> triple that did not originate in the WebID Document: that predicate is authoritative only when sourced there, mirroring the write protection in <cite><a class="bibref" href="#ref-webid-profile">Solid WebID Profile</a></cite> § <a href="https://solid.github.io/webid-profile/#updating-profile">Updating Profile</a>. Other discovery predicates (e.g., <code>pim:storage</code>, <code>ldp:inbox</code>) may legitimately appear in any of these documents.</li>

Comment thread solid26.html
<div datatype="rdf:HTML" property="schema:description">
<ol>
<li>
The WebID Document is a public resource (i.e. an unauthenticated HTTP <code>GET</code> on the WebID URI returns the Profile) [<cite><a class="bibref" href="#ref-webid">WebID 1.0</a></cite> § <a href="https://www.w3.org/2005/Incubator/webid/spec/identity/#processing-the-webid-profile">Processing the WebID Profile</a>].
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The WebID Document is a public resource (i.e. an unauthenticated HTTP <code>GET</code> on the WebID URI returns the Profile) [<cite><a class="bibref" href="#ref-webid">WebID 1.0</a></cite> § <a href="https://www.w3.org/2005/Incubator/webid/spec/identity/#processing-the-webid-profile">Processing the WebID Profile</a>].
The WebID Document is a public resource (i.e., an unauthenticated HTTP <code>GET</code> on the WebID URI returns the Profile) [<cite><a class="bibref" href="#ref-webid">WebID 1.0</a></cite> § <a href="https://www.w3.org/2005/Incubator/webid/spec/identity/#processing-the-webid-profile">Processing the WebID Profile</a>].

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.