<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en"><head><title>On-Behalf-Of Semantics for JSON Web Tokens (JWTs)</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="On-Behalf-Of Semantics for JSON Web Tokens (JWTs)">
<meta name="keywords" content="RFC, Request for Comments, I-D, Internet-Draft, JSON Web Token, JWT, Delegation, On-behalf-of, act as">
<meta name="generator" content="xml2rfc v1.35 (http://xml.resource.org/)">
<style type='text/css'><!--
        body {
                font-family: verdana, charcoal, helvetica, arial, sans-serif;
                font-size: small; color: #000; background-color: #FFF;
                margin: 2em;
        }
        h1, h2, h3, h4, h5, h6 {
                font-family: helvetica, monaco, "MS Sans Serif", arial, sans-serif;
                font-weight: bold; font-style: normal;
        }
        h1 { color: #900; background-color: transparent; text-align: right; }
        h3 { color: #333; background-color: transparent; }

        td.RFCbug {
                font-size: x-small; text-decoration: none;
                width: 30px; height: 30px; padding-top: 2px;
                text-align: justify; vertical-align: middle;
                background-color: #000;
        }
        td.RFCbug span.RFC {
                font-family: monaco, charcoal, geneva, "MS Sans Serif", helvetica, verdana, sans-serif;
                font-weight: bold; color: #666;
        }
        td.RFCbug span.hotText {
                font-family: charcoal, monaco, geneva, "MS Sans Serif", helvetica, verdana, sans-serif;
                font-weight: normal; text-align: center; color: #FFF;
        }

        table.TOCbug { width: 30px; height: 15px; }
        td.TOCbug {
                text-align: center; width: 30px; height: 15px;
                color: #FFF; background-color: #900;
        }
        td.TOCbug a {
                font-family: monaco, charcoal, geneva, "MS Sans Serif", helvetica, sans-serif;
                font-weight: bold; font-size: x-small; text-decoration: none;
                color: #FFF; background-color: transparent;
        }

        td.header {
                font-family: arial, helvetica, sans-serif; font-size: x-small;
                vertical-align: top; width: 33%;
                color: #FFF; background-color: #666;
        }
        td.author { font-weight: bold; font-size: x-small; margin-left: 4em; }
        td.author-text { font-size: x-small; }

        /* info code from SantaKlauss at http://www.madaboutstyle.com/tooltip2.html */
        a.info {
                /* This is the key. */
                position: relative;
                z-index: 24;
                text-decoration: none;
        }
        a.info:hover {
                z-index: 25;
                color: #FFF; background-color: #900;
        }
        a.info span { display: none; }
        a.info:hover span.info {
                /* The span will display just on :hover state. */
                display: block;
                position: absolute;
                font-size: smaller;
                top: 2em; left: -5em; width: 15em;
                padding: 2px; border: 1px solid #333;
                color: #900; background-color: #EEE;
                text-align: left;
        }

        a { font-weight: bold; }
        a:link    { color: #900; background-color: transparent; }
        a:visited { color: #633; background-color: transparent; }
        a:active  { color: #633; background-color: transparent; }

        p { margin-left: 2em; margin-right: 2em; }
        p.copyright { font-size: x-small; }
        p.toc { font-size: small; font-weight: bold; margin-left: 3em; }
        table.toc { margin: 0 0 0 3em; padding: 0; border: 0; vertical-align: text-top; }
        td.toc { font-size: small; font-weight: bold; vertical-align: text-top; }

        ol.text { margin-left: 2em; margin-right: 2em; }
        ul.text { margin-left: 2em; margin-right: 2em; }
        li      { margin-left: 3em; }

        /* RFC-2629 <spanx>s and <artwork>s. */
        em     { font-style: italic; }
        strong { font-weight: bold; }
        dfn    { font-weight: bold; font-style: normal; }
        cite   { font-weight: normal; font-style: normal; }
        tt     { color: #036; }
        tt, pre, pre dfn, pre em, pre cite, pre span {
                font-family: "Courier New", Courier, monospace; font-size: small;
        }
        pre {
                text-align: left; padding: 4px;
                color: #000; background-color: #CCC;
        }
        pre dfn  { color: #900; }
        pre em   { color: #66F; background-color: #FFC; font-weight: normal; }
        pre .key { color: #33C; font-weight: bold; }
        pre .id  { color: #900; }
        pre .str { color: #000; background-color: #CFF; }
        pre .val { color: #066; }
        pre .rep { color: #909; }
        pre .oth { color: #000; background-color: #FCF; }
        pre .err { background-color: #FCC; }

        /* RFC-2629 <texttable>s. */
        table.all, table.full, table.headers, table.none {
                font-size: small; text-align: center; border-width: 2px;
                vertical-align: top; border-collapse: collapse;
        }
        table.all, table.full { border-style: solid; border-color: black; }
        table.headers, table.none { border-style: none; }
        th {
                font-weight: bold; border-color: black;
                border-width: 2px 2px 3px 2px;
        }
        table.all th, table.full th { border-style: solid; }
        table.headers th { border-style: none none solid none; }
        table.none th { border-style: none; }
        table.all td {
                border-style: solid; border-color: #333;
                border-width: 1px 2px;
        }
        table.full td, table.headers td, table.none td { border-style: none; }

        hr { height: 1px; }
        hr.insert {
                width: 80%; border-style: none; border-width: 0;
                color: #CCC; background-color: #CCC;
        }
--></style>
</head>
<body>
<table summary="layout" cellpadding="0" cellspacing="2" class="TOCbug" align="right"><tr><td class="TOCbug"><a href="#toc"> TOC </a></td></tr></table>
<table summary="layout" width="66%" border="0" cellpadding="0" cellspacing="0"><tr><td><table summary="layout" width="100%" border="0" cellpadding="2" cellspacing="1">
<tr><td class="header">Network Working Group</td><td class="header">M. Jones (editor)</td></tr>
<tr><td class="header">Internet-Draft</td><td class="header">Y. Goland</td></tr>
<tr><td class="header">Intended status: Standards Track</td><td class="header">Microsoft</td></tr>
<tr><td class="header">Expires: April 29, 2011</td><td class="header">October 26, 2010</td></tr>
</table></td></tr></table>
<h1><br />On-Behalf-Of Semantics for JSON Web Tokens (JWTs)<br />draft-jones-on-behalf-of-jwt-00</h1>

<h3>Abstract</h3>

<p>
        This specification defines how to express the claim that one
        principal is allowed to act on behalf of another principal in
        a defined context using <a class='info' href='#JWT'>JSON Web Tokens
        (JWTs)<span> (</span><span class='info'>Jones (editor), M., Balfanz, D., Bradley, J., Goland, Y., Panzer, J., and N. Sakimura, “JSON Web Token (JWT),” October 2010.</span><span>)</span></a> [JWT].
      
</p>
<h3>Requirements Language</h3>

<p>
        The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
        "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
        document are to be interpreted as described in <a class='info' href='#RFC2119'>RFC 2119<span> (</span><span class='info'>Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels,” March 1997.</span><span>)</span></a> [RFC2119].
      
</p>
<h3>Status of this Memo</h3>
<p>
This Internet-Draft is submitted  in full
conformance with the provisions of BCP 78 and BCP 79.</p>
<p>
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF).  Note that other groups may also distribute
working documents as Internet-Drafts.  The list of current
Internet-Drafts is at http://datatracker.ietf.org/drafts/current/.</p>
<p>
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any time.
It is inappropriate to use Internet-Drafts as reference material or to cite
them other than as “work in progress.”</p>
<p>
This Internet-Draft will expire on April 29, 2011.</p>

<h3>Copyright Notice</h3>
<p>
Copyright (c) 2010 IETF Trust and the persons identified as the
document authors.  All rights reserved.</p>
<p>
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of
publication of this document.  Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License.</p>
<a name="toc"></a><br /><hr />
<h3>Table of Contents</h3>
<p class="toc">
<a href="#anchor1">1.</a> 
Introduction<br />
<a href="#anchor2">2.</a> 
On-Behalf-Of vs. Impersonation Semantics<br />
<a href="#anchor3">3.</a> 
on-behalf-of claims<br />
<a href="#IANA">4.</a> 
IANA Considerations<br />
<a href="#Security">5.</a> 
Security Considerations<br />
<a href="#rfc.references1">6.</a> 
Normative References<br />
<a href="#rfc.authors">§</a> 
Authors' Addresses<br />
</p>
<br clear="all" />

<a name="anchor1"></a><br /><hr />
<table summary="layout" cellpadding="0" cellspacing="2" class="TOCbug" align="right"><tr><td class="TOCbug"><a href="#toc"> TOC </a></td></tr></table>
<a name="rfc.section.1"></a><h3>1. 
Introduction</h3>

<p>
        This specification defines how to express the claim that one
        principal is allowed to act on behalf of another principal in
        a defined context using <a class='info' href='#JWT'>JSON Web Tokens
        (JWTs)<span> (</span><span class='info'>Jones (editor), M., Balfanz, D., Bradley, J., Goland, Y., Panzer, J., and N. Sakimura, “JSON Web Token (JWT),” October 2010.</span><span>)</span></a> [JWT].
      
</p><div style='display: table; width: 0; margin-left: 3em; margin-right: auto'><pre>
{
 "obo":
 {
  "prn":"mailto:joe@example.com",
  "ctx":["urn:adatum.com:calendar"]
 }
}
</pre></div>
<p>
        In this example, the "obo" (on-behalf-of) claim would be
        included in a JWT's claims section. The claim states that the
        holder of the bearer token has the right to act on behalf of
        the principal mailto:joe@example.com in the context of the
        service type urn:adatum.com:calendar.
      
</p>
<a name="anchor2"></a><br /><hr />
<table summary="layout" cellpadding="0" cellspacing="2" class="TOCbug" align="right"><tr><td class="TOCbug"><a href="#toc"> TOC </a></td></tr></table>
<a name="rfc.section.2"></a><h3>2. 
On-Behalf-Of vs. Impersonation Semantics</h3>

<p>
        When principal A acts on behalf of principal B, A is given all
        the rights that B has within some defined rights context. With
        on-behalf-of semantics, principal A still has its own identity
        separate from B and it is explicitly understood that while B
        may have delegated its rights to A, any actions taken are
        being taken by A and not B. In a sense, A is an agent for B.
      
</p>
<p>
        On-behalf-of semantics are therefore different than
        impersonation semantics, with which it is sometimes
        confused. When principal A impersonates principal B, then in
        so far as any entity receiving claims is concerned, they are
        actually dealing with B. It is true that some members of the
        identity system might have awareness that impersonation is
        going on but it is not a requirement. For all intents and
        purposes, A is B.
      
</p>
<a name="anchor3"></a><br /><hr />
<table summary="layout" cellpadding="0" cellspacing="2" class="TOCbug" align="right"><tr><td class="TOCbug"><a href="#toc"> TOC </a></td></tr></table>
<a name="rfc.section.3"></a><h3>3. 
on-behalf-of claims</h3>

<p>
        An on-behalf-of claim made in a JWT consists of a child member
        of the root JSON object with the member name "obo"
        (on-behalf-of). The "obo" claim MUST contain the two child
        members, "prn" (principal) and "ctx" (context). "obo" MAY
        contain other child members.
      
</p>
<p>
        If a JWT processor receives an "obo" claim with an
        unrecognized child member, then this means the "obo" claim is
        invalid and unless separate semantics have been applied, an
        invalid "obo" claim MUST cause the entire JWT to be rejected
        for processing.
      
</p>
<p>
        The "prn" (principal) child member MUST have a value that is a
        URI (as defined in <a class='info' href='#RFC3986'>RFC 3986<span> (</span><span class='info'>Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): Generic Syntax,” January 2005.</span><span>)</span></a> [RFC3986]).
        The semantics of this URI is that it identifies the principal
        for whom the bearer of the JWT is acting on behalf of.
      
</p>
<p>
        The "ctx" (context) child member MUST have a value that is an
        array of strings, each of which MUST be a URI. All "ctx" value
        arrays MUST contain at least one URI. The members of the array
        define permission contexts in which the bearer is allowed to
        act on behalf of the principal. The definition of these
        contexts is outside the scope of this specification.
      
</p>
<p>
        There is not necessarily a conflict between including an "obo"
        claim along with claims about the identity of the bearer of
        the token.  The former provides a right - the later
        information about the identity of the principal that can
        exercise that right.
      
</p>
<p>
        However, as with any claims, the relationship between "obo"
        and other claims is not defined implicitly. Rather an explicit
        definition must be provided in order for the combined
        semantics to be understood.
      
</p>
<a name="IANA"></a><br /><hr />
<table summary="layout" cellpadding="0" cellspacing="2" class="TOCbug" align="right"><tr><td class="TOCbug"><a href="#toc"> TOC </a></td></tr></table>
<a name="rfc.section.4"></a><h3>4. 
IANA Considerations</h3>

<p>
        The claim "obo" is to be registered in the JWT JSON Web Token
        Claims registry as defined in the <a class='info' href='#JWT'>JWT<span> (</span><span class='info'>Jones (editor), M., Balfanz, D., Bradley, J., Goland, Y., Panzer, J., and N. Sakimura, “JSON Web Token (JWT),” October 2010.</span><span>)</span></a> [JWT] specification.
      
</p>
<a name="Security"></a><br /><hr />
<table summary="layout" cellpadding="0" cellspacing="2" class="TOCbug" align="right"><tr><td class="TOCbug"><a href="#toc"> TOC </a></td></tr></table>
<a name="rfc.section.5"></a><h3>5. 
Security Considerations</h3>

<p>
        All of the normal security issues, especially in relationship
        to comparing URIs and dealing with unrecognized values, that
        are discussed in <a class='info' href='#JWT'>JWT<span> (</span><span class='info'>Jones (editor), M., Balfanz, D., Bradley, J., Goland, Y., Panzer, J., and N. Sakimura, “JSON Web Token (JWT),” October 2010.</span><span>)</span></a> [JWT] also apply
        here.
      
</p>
<p>
        In addition, on-behalf-of introduces its own unique security
        issues. Any time one principal is delegated the rights of
        another principal, the potential for abuse is always a
        concern. That is why the "ctx" (context) member is mandatory
        and must contain at least one value. The context values
        restrict the contexts in which the delegated rights are to be
        exercised. The specification explicitly precludes omitting the
        "ctx" member in order to ensure that there is always some
        context by which the delegated rights are constrained.
      
</p>
<a name="rfc.references1"></a><br /><hr />
<table summary="layout" cellpadding="0" cellspacing="2" class="TOCbug" align="right"><tr><td class="TOCbug"><a href="#toc"> TOC </a></td></tr></table>
<h3>6. Normative References</h3>
<table width="99%" border="0">
<tr><td class="author-text" valign="top"><a name="JWT">[JWT]</a></td>
<td class="author-text">Jones (editor), M., Balfanz, D., Bradley, J., Goland, Y., Panzer, J., and N. Sakimura, “<a href="http://self-issued.info/docs/draft-jones-json-web-token-00.html">JSON Web Token (JWT)</a>,” October 2010.</td></tr>
<tr><td class="author-text" valign="top"><a name="RFC2119">[RFC2119]</a></td>
<td class="author-text"><a href="mailto:sob@harvard.edu">Bradner, S.</a>, “<a href="http://tools.ietf.org/html/rfc2119">Key words for use in RFCs to Indicate Requirement Levels</a>,” BCP 14, RFC 2119, March 1997 (<a href="http://www.rfc-editor.org/rfc/rfc2119.txt">TXT</a>, <a href="http://xml.resource.org/public/rfc/html/rfc2119.html">HTML</a>, <a href="http://xml.resource.org/public/rfc/xml/rfc2119.xml">XML</a>).</td></tr>
<tr><td class="author-text" valign="top"><a name="RFC3986">[RFC3986]</a></td>
<td class="author-text"><a href="mailto:timbl@w3.org">Berners-Lee, T.</a>, <a href="mailto:fielding@gbiv.com">Fielding, R.</a>, and <a href="mailto:LMM@acm.org">L. Masinter</a>, “<a href="http://tools.ietf.org/html/rfc3986">Uniform Resource Identifier (URI): Generic Syntax</a>,” STD 66, RFC 3986, January 2005 (<a href="http://www.rfc-editor.org/rfc/rfc3986.txt">TXT</a>, <a href="http://xml.resource.org/public/rfc/html/rfc3986.html">HTML</a>, <a href="http://xml.resource.org/public/rfc/xml/rfc3986.xml">XML</a>).</td></tr>
</table>

<a name="rfc.authors"></a><br /><hr />
<table summary="layout" cellpadding="0" cellspacing="2" class="TOCbug" align="right"><tr><td class="TOCbug"><a href="#toc"> TOC </a></td></tr></table>
<h3>Authors' Addresses</h3>
<table width="99%" border="0" cellpadding="0" cellspacing="0">
<tr><td class="author-text"> </td>
<td class="author-text">Michael B. Jones (Editor)</td></tr>
<tr><td class="author-text"> </td>
<td class="author-text">Microsoft</td></tr>
<tr cellpadding="3"><td> </td><td> </td></tr>
<tr><td class="author-text"> </td>
<td class="author-text">Yaron Y. Goland</td></tr>
<tr><td class="author-text"> </td>
<td class="author-text">Microsoft</td></tr>
</table>
</body></html>