我在基于Web API 2模板的Web服务中设置刷新令牌 . 它将由我们自己的网站和外部客户使用 .
经过一段时间的研究,关于从XSS攻击中保护刷新令牌的一般建议是将标识符存储在加密的cookie中 . 我知道我可以使用UseCookieAuthentication方法而不是UseOAuthBearerAuthentication返回cookie中的身份验证和刷新令牌,但这会在我处理外部客户端时造成复杂化 .
我目前用于设置配置的代码是:
public void ConfigureAuth(IAppBuilder app)
{
var applicationProvider = new ApplicationOAuthProvider();
var applicationRefreshProvider = new ApplicationRefreshTokenProvider();
var oAuthServerOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = applicationProvider,
RefreshTokenProvider = applicationRefreshProvider
};
// Token Generation
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
我可以实现的解决方法是向资源服务器上的控制器添加一个方法,然后为基于javascript的客户端执行转换步骤,但这对我来说没有多大意义 .
有没有办法可以在auth配置中实现这一点,这是正确的方法吗?如果我能提供帮助,我不想走错方向 .
1 回答
我一直在研究这个问题,我只是在试验,而我还没有最终确定解决方案 . 但是,我发现在我的refreshTokenProvider中,在CreateAsync方法中,而不是context.SetToken,我可以这样做:
这将在响应中设置一个cookie,而不是像人们期望的那样向JSON响应体添加刷新令牌 . 我的计划是执行此操作或使用SetToken,具体取决于请求刷新令牌的客户端 .
然后,在ReceiveAsync方法中,我有:
到目前为止,我发现的唯一警告是,在发送grant_type = refresh_token请求时创建的AuthenticationTokenReceiveContext构造函数将不允许空令牌,因此如果我将任何字符串作为refresh_token传递它将正常工作 .
重复一遍,我还没有完全充实它 . 我需要弄清楚如何缓解CSRF攻击并显然加密cookie,将其标记为仅限http等等 . 我确信这些都不是不可克服的 . 但是我希望这可以帮助其他人,并可能引发讨论,因为我老实说也不知道我是否正在做这个"correctly" . 但它确实有效,我的目标是在此之后提出一个解决方案:http://jeremymarc.github.io/2014/08/14/oauth2-with-angular-the-right-way/ .