首页 文章

在ASP.NET MVC项目和Web API项目之间共享cookie

提问于
浏览
6

我有一个有2个项目的解决方案 . 一个是ASP.NET MVC Web应用程序,另一个是Web API项目 . 我想要做的是在两个应用程序之间共享cookie . 在服务器上部署时,第一个应用程序托管在 mydomain.com 上,另一个应用程序托管在 api.mydomain.com (子域) . 我也使用https . 我在MVC项目中使用ASP.NET Identity作为身份验证系统 . 在互联网上阅读了大量文章后,我做了以下工作:

1)在web.config文件中,在两个项目中都包含以下机器密钥标记 .

<machineKey validationKey="3DF5D185FFB897592E14ED51A6DDC3E2729827A2F2180151A1BC39BE5C035D15F23700C928EFDBACEAEE498D05B76C65537FDEFB673039BCD961045C3BA8ACD3" 
            decryptionKey="CE274BA1DB61C086A80F5D8BD1AC5AC92A8BA19F37E04FC7" validation="SHA1" />

2)在MVC项目中,我以下列方式配置了ASP.NET Identity Cookie:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
      LoginPath = new PathString("/Home/index"),
      Provider = new CookieAuthenticationProvider
      {  
            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(TimeSpan.FromMinutes(30), (manager, user) => user.GenerateUserIdentityAsync(manager))
      },
      SlidingExpiration = true,
      ExpireTimeSpan = TimeSpan.FromMinutes(45),
      CookieName = "MyCookie",
      CookieDomain = ".mydomain.com"
 });

3)在Web API项目中,我启用并配置了CORS,我在web.config中添加了以下配置(CORS在 生产环境 环境中正常工作):

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Credentials" value="true"></add>
    <add name="Access-Control-Allow-Origin" value="mydomain.com" />
    <add name="Access-Control-Allow-Headers" value="content-type" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
  </customHeaders>
</httpProtocol>

4)我已经添加了httpCookies部分(在两个项目中),如下所示:

<httpCookies requireSSL="true" domain=".mydomain.com" httpOnlyCookies="true" />

在我的Web API控制器中,我已应用 Authorize 属性,如下所示:

[Authorize]
public class MyController : ApiController
{
   //My action methods here
}

最后,我从MVC项目尝试使用jQuery Ajax请求调用我的服务 .

$.ajax({
   url: viewModelParameters.myUrl,
   type: "get",
   dataType: "json",
   data: { userId: viewModelParameters.id },
   xhrFields: {
      withCredentials: true
   },
   crossDomain: true,
   statusCode: {
      200: function (user) {
      }
   }
});

我收到以下消息:

此请求已被拒绝授权 .

在请求标头中,我可以看到cookie包含在请求中 . 你能否提出解决方案或者想一想我错过了什么?先感谢您 .

1 回答

  • 0

    您需要在WebAPI和MVC项目中包含 app.UseCookieAuthentication() .

相关问题