我有两个项目的解决方案。一个是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]
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包含在请求中。你能否提出解决方案或者想一想我错过了什么?提前谢谢。
答案 0 :(得分:0)
您需要在WebAPI和MVC项目中包含app.UseCookieAuthentication()
。