2014-03-26 170 views
1

我有一個Web應用程序的API,正是如此初始化:身份驗證,不需要JavaScript?

 app.UseCookieAuthentication(); 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
     app.UseOAuthBearerTokens(OAuthOptions); 
     app.UseGoogleAuthentication(); 

對於打給大多數控制器,它的偉大工程。然而,它也需要一些JavaScript客戶端服務調用才製成:

function getSecurityHeaders() { 
    var accessToken = sessionStorage["accessToken"] || localStorage["accessToken"]; 
    if (accessToken) { 
     return { "Authorization": "Bearer " + accessToken }; 
    } 
    return {}; 
} 

的問題是,我們有一定類型的控制器在沒有JavaScript可以在運行(一個訪問的文件)呼叫。例如,該呼叫可以是:

http://mysite/mycontroller/file/filename.jpg 

...其中值被指定爲img標記的src屬性。該調用有效,但Thread.CurrentPrincipal.Identity未用空名稱進行認證,所以目前還沒有一種強制執行安全措施的方法。

我是新來的Web API,所以它可能是一個愚蠢的問題,但這是怎麼回事?我需要翻轉哪些開關以便不需要JavaScript來添加安全標頭?我正在考慮試圖找到一種方法來強制IAuthorizationFilter中的授權頭或其他東西,但我甚至不確定這會起作用。

+0

好像你在同一個項目中合併了兩種類型的控制器(經典的MVC和WebAPI)。 你用什麼來驗證你的JavaScript運行的頁面? –

+0

這些頁面本身或者不需要認證或者使用Angular JS,我認爲這只是通過JavaScript來檢查認證。 – Colin

回答

1

所以我想出瞭解決我的問題。

首先,我需要配置該應用使用正是如此外部的cookie的認證類型:

//the line below is the one I needed to change 
    app.UseCookieAuthentication(AuthenticationType = DefaultAuthenticationTypes.ExternalCookie); 

    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
    app.UseOAuthBearerTokens(OAuthOptions); 
    app.UseGoogleAuthentication(); 

其次,原來有代碼在我WebApiConfig文件中的一行被禁用讀取外部餅乾:

//this line needed to be removed 
    //config.SuppressDefaultHostAuthentication(); 

在那之後,我可以看到從谷歌外部cookie,它沿着一個電子郵件地址,我可以識別與用戶通過。