dotnetopenauth - 如何在刷新令牌中添加额外数据?

时间:2012-10-17 18:17:43

标签: oauth-2.0 dotnetopenauth

我目前正在开发一个iPad应用程序需要访问现有Web应用程序的项目。 iPad应用程序是内部开发的,因此是值得信赖的应用程序。但是,Web应用程序提供的数据非常敏感,因此我们不希望在iPad上存储客户端凭据。我们还希望能够在不影响常规用户访问的情况下撤销iPad访问权限。

鉴于上述情况,OAuth2资源所有者密码凭证授权/流程非常适合我们使用DotNetOpenAuth实现的要求,因为它已经建立了库。

但是,我们现在需要将一些元数据添加到资源服务器的访问和刷新令牌中。授权服务器通过我们的IAuthorizationServerHost.CreateAccessToken方法实现中的AuthorizationServerAccessToken.ExtraData属性添加元数据:

public AccessTokenResult CreateAccessToken(IAccessTokenRequest accessTokenRequestMessage)
{
    var accessToken = new AuthorizationServerAccessToken();

    // Add some extra data to access token
    accessToken.ExtraData.Add("server_parameter1", this.ServerValue1);
    accessToken.ExtraData.Add("server_parameter2", this.ServerValue2);

    // Set ResourceServerEncryptionKey properties etc

    return new AccessTokenResult(accessToken);
}

这完全符合我们对访问令牌的要求,但刷新令牌中不包含相同的“ExtraData”,当访问令牌过期并需要刷新时会导致问题,因为我们实际上会丢失其他数据(因为旧的访问令牌被丢弃。)

有人可以建议是否可以以与访问令牌类似的方式填充当前版本的DotNetOpenAuth中的刷新令牌“ExtraData”?

1 个答案:

答案 0 :(得分:1)

不,我认为目前没有办法将额外数据嵌入刷新令牌中。我们来谈谈为什么会这样。

首先,无论你是否开发,都没有可靠的iPad应用程序。问题是你分发的应用程序(甚至内部)无法保密。任何client_secret,证书等都可以被破解。因此,您分发的应用程序无法向服务器验证自己。如果服务器无法对客户端进行身份验证,则服务器无法信任该客户端。

现在让我们再看一下您的情景(如果您有更多反馈,最好继续讨论dotnetopenid@googlegroups.com)。客户端具有最终要在资源服务器上结束的数据。您当前正尝试首先通过授权服务器传递该数据,然后通过访问令牌传递给资源服务器。这是为什么?为什么不让客户端将数据与访问令牌一起直接发送到资源服务器?如果答案是资源服务器不应该信任客户端,那么通过访问令牌发送它所带来的是一种错误的安全感,原因在上面的段落中给出。如果客户端可能向资源服务器提供错误信息,则它还可能向授权服务器提供错误数据。

访问令牌中额外数据的一个有效用途是授权服务器自身知道的数据 - 而不是来自客户端的数据。在这种情况下,它可以在每次创建访问令牌时查找该数据,因此不必存储在刷新令牌中。