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

Oauth 2.0 dotnetopenauth-如何在刷新令牌中添加额外数据?,oauth-2.0,dotnetopenauth,Oauth 2.0,Dotnetopenauth,我目前正在从事一个项目,其中iPad应用程序需要访问现有的web应用程序。iPad应用程序是内部开发的,因此是一个值得信赖的应用程序。但是,web应用程序提供的数据是敏感的,因此我们不希望将客户端凭据存储在iPad上。我们还希望能够在不影响正常用户访问的情况下撤销iPad访问权限 综上所述,OAuth2资源所有者密码凭证授权/流非常适合我们的需求,我们使用DotNetOpenAuth实现了它,因为它是一个已建立的库 但是,我们现在需要将一些元数据添加到资源服务器的访问和刷新令牌中。授权服务器正在

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

综上所述,OAuth2资源所有者密码凭证授权/流非常适合我们的需求,我们使用DotNetOpenAuth实现了它,因为它是一个已建立的库

但是,我们现在需要将一些元数据添加到资源服务器的访问和刷新令牌中。授权服务器正在IAAuthorizationServerHost.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”?

否,我认为目前没有将额外数据嵌入刷新令牌的方法。让我们谈谈为什么会这样

首先,不管你开发与否,都没有值得信赖的iPad应用程序。问题是,你发布的应用程序(即使是在内部)无法保密。任何客户机密、证书等都可能被破解。因此,您分发的应用程序无法向服务器进行身份验证。如果服务器无法对客户端进行身份验证,则服务器无法信任客户端

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


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

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

首先,不管你开发与否,都没有值得信赖的iPad应用程序。问题是,你发布的应用程序(即使是在内部)无法保密。任何客户机密、证书等都可能被破解。因此,您分发的应用程序无法向服务器进行身份验证。如果服务器无法对客户端进行身份验证,则服务器无法信任客户端

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


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

抱歉,我的问题有误导性-额外的数据实际上来自授权服务器,并且是客户端发出请求时资源服务器所需要的。客户端不知道额外的数据。我编辑了这个问题来澄清。然而,从你的第一条评论来看,这似乎无论如何都是不可能的。如果是这种情况,请让我知道,我会将其标记为例外答案是否可以在CreateAccessToken方法中确定用户名?我已经检查了我们的代码,如果我们可以在创建访问令牌时确定用户,我们可以避免刷新令牌中的额外数据。对。这是不可能的。很高兴听到您只需要访问授权用户。这只是一个疏忽,
CreateAccessToken
遗漏了该参数。会的。很抱歉,我的问题有误导性-额外的数据实际上来自授权服务器,并且是客户端发出请求时资源服务器所需要的。客户端不知道额外的数据。我编辑了这个问题来澄清。然而,从你的第一条评论来看,这似乎无论如何都是不可能的。如果是这种情况,请让我知道,我会将其标记为例外答案是否可以在CreateAccessToken方法中确定用户名?我已经检查了我们的代码,我们已经完成了c