asp.net-mvc – Owin如何在Application_EndRequest阶段之后设置Asp.Net Ide
|
作为测试,我使用Visual Studio 2013中的最新模板创建了一个全新的Asp.Net MVC5应用程序.我将以下方法添加到Global.asax.cs: protected void Application_PreSendRequestHeaders()
{
Response.AppendCookie(new HttpCookie("TotalNumberOfCookiesInApplication_EndRequestIs",Response.Cookies.Count + string.Empty));
}
当我启动应用程序并使用注册用户的凭据对/ Account / Login执行POST时,返回给客户端的cookie是: 请注意,我添加的自定义cookie显示,在调用Application_PreSendRequestHeaders()时,响应中没有设置cookie.尽管如此,所有Auth cookie都会到达客户端.我理解Application_PreSendRequestHeaders()是我们可以“挂钩”修改cookie的最后阶段. Owin中间件是否能够以某种方式添加cookie,或者我错过了什么? (如果你感兴趣的话,我对这一切的动机是:我试图将auth cookie的域名修改为“.abc.com”,其中“abc.com”是主机的最后两部分在请求URI中.我想这样做是为了支持跨多个子域的身份验证.在全局Owin配置(IAppBuilder)的上下文中设置CookieDomain是不够的,因为请求主机在我们的调试/登台/生产环境之间发生变化,在进行VIP交换之前,我们经常首先将生产代码部署到Azure分段进行测试. (另请注意,我知道像this one这样的帖子,但是它没有解释实际设置cookie的位置) 编辑: 基于更多的搜索,似乎我正在寻找错误的管道. Owin有自己的管道,所以我找到了this post,它描述了我们如何能够加入它. Viola …有饼干.如果有人能够确认这确实是最明智的做法,那将会很棒. 编辑2: 最后决定查看Katana源代码并发现我需要做的就是设置我的cookie域名是我的CookieAuthenticationProvider中的以下代码 OnResponseSignIn = context =>
{
// Example only!
context.CookieOptions.Domain = context.Request.Uri.Host;
},OnResponseSignOut = context =>
{
// Example only!
context.CookieOptions.Domain = context.Request.Uri.Host;
}
编辑3: 对我来说更简洁的解决方案就是使用自定义cookie管理器,它根据当前请求URI设置cookie域: /// <summary>
/// This class simply appends the cookie domain to the usual auth cookies
/// </summary>
public class ChunkingCookieManagerWithSubdomains : ICookieManager
{
private readonly ChunkingCookieManager _chunkingCookieManager;
public ChunkingCookieManagerWithSubdomains()
{
_chunkingCookieManager = new ChunkingCookieManager();
}
public string GetRequestCookie(IOwinContext context,string key)
{
return _chunkingCookieManager.GetRequestCookie(context,key);
}
public void AppendResponseCookie(IOwinContext context,string key,string value,CookieOptions options)
{
// Simplification (use the context parameter to get the required request info)
options.Domain = ".domainBasedOnRequestInContext.com";
_chunkingCookieManager.AppendResponseCookie(context,key,value,options);
}
public void DeleteCookie(IOwinContext context,CookieOptions options)
{
// Simplification (use the context parameter to get the required request info)
options.Domain = ".domainBasedOnRequestInContext.com";
_chunkingCookieManager.DeleteCookie(context,options);
}
}
…然后在Owin设置中的Cookie身份验证选项中设置: app.UseCookieAuthentication(new CookieAuthenticationOptions
{
...
CookieManager = new ChunkingCookieManagerWithSubdomains(),...
}
});
希望能帮助有人遇到同样的问题. 解决方法根据Tieson的要求,这里是我在上面原始帖子中编辑的摘要,作为答案.建议的解决方案:使用自定义cookie管理器. /// <summary>
/// This class simply appends the cookie domain to the usual auth cookies
/// </summary>
public class ChunkingCookieManagerWithSubdomains : ICookieManager
{
private readonly ChunkingCookieManager _chunkingCookieManager;
public ChunkingCookieManagerWithSubdomains()
{
_chunkingCookieManager = new ChunkingCookieManager();
}
public string GetRequestCookie(IOwinContext context,options);
}
}
…然后可以在Owin设置中的Cookie身份验证选项中设置: app.UseCookieAuthentication(new CookieAuthenticationOptions
{
...
CookieManager = new ChunkingCookieManagerWithSubdomains(),...
}
}); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 在Response.Redirect之后获取上一页网址
- asp.net-mvc – ASP.NET MVC路由问题
- asp.net 大文件上传 之 改版了的SlickUpload.HttpUploadMod
- asp.net – 避免表格重新提交
- asp.net – 如果页面上有异常,则输出缓存无效
- asp.net-mvc – 如何将IoC成员资格提供程序与ASP.NET MVC集
- asp.net – 可以从没有这些.svn文件夹的subversion中检出文
- asp.net – 如何知道为什么IIS应用程序池被回收
- identity – 更改MVC 5中的用户名
- asp.net-mvc – 使用actionlink将文本框的值从视图传递到控
- 在ASP.NET MVC中使用MySQL的AccountController
- asp.net-mvc – DDD原理和ASP.NET MVC项目设计
- asp.net – 无法加载文件或程序集“Microsoft.We
- .net – 包恢复失败.回滚包更改 – Serilog.AspN
- .net – 如何在同一个域但不同的主机上共享本地存
- asp.net – 基类包含字段’X’,但其类型(System.
- asp.net-mvc – 在ASP.NET MVC Preview 4中使用路
- asp.net – 在调用异步方法时不使用等待来防止死
- asp.net-core – 找不到Swashbuckle.AspNetCore
- asp.net-mvc – 允许一个人一次使用帐户的可重用
