1

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

鉴于上述情况,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);
}

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

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

4

1 回答 1

1

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

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

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

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

于 2012-10-18T15:31:26.080 回答