我有一个Web应用程序,该应用程序使用外部登录服务(oauth)进行身份验证,并且需要重定向到SSO服务器进行登录。 我的问题是,第一次登录浏览器保存了与SSO相关的cookie,而第二次却不要求用户名密码,只是从SSO弹回主Web应用程序
我尝试手动删除Cookie,它起作用了!但是当我尝试用一段代码来做到这一点时:
foreach (var cookie in Request.Cookies.Keys) Response.Cookies.Delete(cookie);
它也将被删除,但看起来就像已被删除,不会要求用户凭据反弹
答案 0 :(得分:1)
看来您的问题不在于 cookie,该页面是在您第二次加载时从浏览器缓存中加载的。
您需要为 index.html 页面禁用浏览器缓存,这将在浏览器每次向服务器请求页面时加载新页面。为此,在 index.html 标头中添加元标记。
<meta http-equiv="Cache-control" content="no-cache, no-store">
<meta http-equiv="Pragma" content="no-cache">
no-cache
和 max-age=0, must-revalidate
表示相同的含义。
(Pragma & Cache-Control 是一回事,但来自不同的 HTTP 规范。请在此处查看答案:Difference between Pragma and Cache-control headers?)
或者您可以将日期附加到脚本标签以获取 js
<script src="js/config.js?v="+ new Date() type="text/javascript"></script>
通过这样做,无论前端何时发送查询,它都会附加新的日期时间,这表明缓存的 js 与请求不同,并防止加载页面的缓存版本,现在在加载新页面后(不是来自缓存),将发生身份验证请求,成功登录后,您的页面将被重定向。
如果您担心每次导航时加载时的性能,则必须使用像 Angular 这样的框架,它是单页应用程序,因此在重新加载时它只会加载一次,并在导航时继续。
在根 web.config 中,我们通过将 cache-control、Pragma 和 Expires 请求标头以及 max-age 设置为 0 来指定我们不想缓存 index.html。
<location path="index.html">
<system.webServer>
<staticContent>
<clientCache cacheControlMode="DisableCache" cacheControlMaxAge="0.00:00:00" />
</staticContent>
<httpProtocol>
<customHeaders>
<add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
<add name="Pragma" value="no-cache" />
<add name="Expires" value="-1" />
</customHeaders>
</httpProtocol>
</system.webServer>
</location>
有关缓存的更多详细信息,请查看这些