2014-03-26 120 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,它沿着一个电子邮件地址,我可以识别与用户通过。