2017-04-11 73 views
0

嗨有效我创建了个人帐户一个MVC SPA的应用程序启用并成功能够获得访问令牌注册过程后的accessToken不跨域API

我也创造了个人账户WEB API项目启用。并在本地主机上托管MVC和API项目。

我试图从保存在我的会话存储承载令牌的MVC应用程序访问API。只要两个项目都在localhost中,它就可以正常工作。我在Azure中托管了API项目,并且如果我尝试使用Web应用程序创建的不记名令牌从本地主机MVC应用程序访问它,API调用将始终返回“未授权”。

示例代码:

MVC应用:

$.ajax({ 
     url: 'https://azureapi/api/getProducts', 
     headers: { 
      'Authorization': 'Bearer ' + accesstoken, 
      'Content-Type': 'application/json; charset=utf-8' 
     }, 
     type: "POST", /* or type:"GET" or type:"PUT" */ 
     dataType: "json", 
     data: JSON.stringify(model), 
     success: function (result) { 


     }, 
     error: function (e) { 
      debugger; 
      console.log(e.responseText); 
     } 
    }); 

API项目:

[Authorize] 
    [Route("getProducts")] 
    [HttpPost] 
    public HttpResponseMessage GetProducts(ProductCriteria model) 
    {} 

在WEB API 启用CORS

// Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 
     var enableCORS = new EnableCorsAttribute("*", "*", "*"); 
     config.EnableCors(enableCORS); 
+1

是因为CORS(预检OPTIONS请求未通过)或拒绝请求他们是否拒绝了您的应用程序后端代码(例如访问令牌验证)? –

+0

我没有线索。如果我尝试在fiddler中运行请求,即使我在Auth头文件中传递了有效的不记名令牌,我也会得到“未授权”,如果我在本地主机中同时托管了MVC和API解决方案,那么相同的持票人令牌就可以工作。我是否需要在API的web.config中添加任何设置? – DevExpress

+1

您可能需要确保两个站点共享相同的machineKey。 –

回答

0

正如克里斯在他的评论中提到的,为了让站点A将令牌传递给站点B和站点B以“验证”或“授权”它,两个站点必须共享相同的MachineKey。

我相信这可以在两个网站的Web.Config文件中设置,但我没有尝试过(害怕破坏我的网站!)。

这里有一个讨论:How to set machineKey on Azure Website

我问过类似的问题在这里作为一个更大的任务的一部分:ASP.NET Identity 2.0 - Is the expiry timespan stored in the token & different sub-domains

+0

谢谢!但我仍然想知道机器键是如何解决这个问题的。将挖更多.. – DevExpress