2012-10-17 48 views
1

我目前正在研究iPad应用程序需要访问现有Web应用程序的项目。 iPad应用程序已在内部开发,因此是值得信赖的应用程序。但是,Web应用程序提供的数据非常敏感,所以我们不希望将客户端凭据存储在iPad上。我们还希望在不影响普通用户访问的情况下撤消iPad访问权限。dotnetopenauth - 如何在刷新令牌中添加额外的数据?

鉴于上述情况,OAuth2资源所有者密码凭证授权/流程非常适合我们的需求,这是DotNetOpenAuth自建立库以来实施的要求。

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

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); 
} 

这不正是我们想要的访问令牌但不包括在同一“而额外”当访问令牌过期并且需要刷新时导致问题的刷新令牌,因为我们实际上丢失了附加数据(因为旧访问令牌被丢弃)。

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

回答

1

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

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

现在让我们再看看您的场景(如果您有更多反馈,最好继续关于[email protected]的讨论)。客户端拥有想要最终在资源服务器上结束的数据。您目前正试图首先将数据通过授权服务器,然后通过访问令牌传递给资源服务器。这是为什么?为什么不让客户端将数据连同访问令牌一起直接发送到资源服务器?如果答案是资源服务器不应该信任客户端,那么通过访问令牌发送它所带来的错误是由于上面段落中给出的原因而产生的虚假安全感。如果客户端可以向资源服务器提供虚假信息,它也可以向授权服务器提供虚假数据。

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

+0

对不起,我的问题是误导 - 额外的数据实际上来自授权服务器,并且当客户端发出请求时,资源服务器需要额外的数据。客户不知道额外的数据。我编辑了这个问题来澄清。然而,从您的第一条评论来看,似乎无论如何都是不可能的。请让我知道如果是这种情况,我会将此标记为例外答案 – lawst

+0

是否可以在CreateAccessToken方法中确定用户名?我已经检查过我们的代码,如果我们能够在创建访问令牌时确定用户,我们可以避免刷新令牌中的额外数据。 – lawst

+0

没错。这是不可能的。很高兴听到您所需要的只是访问授权用户。这只是一个疏忽,“CreateAccessToken”将该参数留出。它会[很快解决](https://github.com/DotNetOpenAuth/DotNetOpenAuth/issues/219)。 –