[英]OWIN Security - How to return a refresh token in a cookie while maintaining authentication bearer tokens
我在基於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配置中實現這一點,這是正確的方法嗎? 如果我能提供幫助,我不想走錯方向。
我一直在研究這個問題,我只是在試驗,而我還沒有最終確定解決方案 。 但是,我發現在我的refreshTokenProvider中,在CreateAsync方法中,而不是context.SetToken,我可以這樣做:
public async Task CreateAsync(AuthenticationTokenCreateContext context)
{
// actual logic that retrieves refresh token...
context.Response.Cookies.Append("refresh_token", refreshToken.ToString());
}
這將在響應中設置一個cookie,而不是像人們期望的那樣向JSON響應體添加刷新令牌。 我的計划是執行此操作或使用SetToken,具體取決於請求刷新令牌的客戶端。
然后,在ReceiveAsync方法中,我有:
public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
{
var refreshToken = context.Request.Cookies["request_token"];
// actual logic that verifies refresh token, etc.
}
到目前為止,我發現的唯一警告是,在發送grant_type = refresh_token請求時創建的AuthenticationTokenReceiveContext構造函數將不允許空令牌,因此如果我將任何字符串作為refresh_token傳遞它將正常工作。
重復一遍,我還沒有完全充實它。 我需要弄清楚如何緩解CSRF攻擊並顯然加密cookie,將其標記為僅限http等等。我確信這些都不是不可克服的。 但是我希望這可以幫助別人並且可能引發討論,因為我老實說也不知道我是否“正確地”這樣做了。 但它確實有效 ,我的目標是在此之后提出一個解決方案: http : //jeremymarc.github.io/2014/08/14/oauth2-with-angular-the-right-way/ 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.