我在使用OWIN Cookie身份验证时遇到了一些问题。我有一个.Net站点,它有一些MVC页面,它使用cookie认证和受承载令牌保护的WebAPI资源。
当我退出时,我删除了客户端上的访问令牌,因此后续API请求将不会在标头中包含令牌,因此将无法通过身份验证。这部分很好。
以同样的方式,我还希望注销以删除MVC页面使用的cookie。我在服务器上执行了以下操作:
[Route("Logout")]
public IHttpActionResult Logout()
{
var ctx = Request.GetOwinContext();
var authenticationManager = ctx.Authentication;
authenticationManager.SignOut();
return Ok();
}
然而,在调用Logout之后,我仍然可以访问受保护的MVC页面,即使这个cookie本应被Logout调用删除了。
看起来很简单,所以我可能错过了一些东西。
谢谢,
答案 0 :(得分:42)
过去几天我遇到了类似的问题。而不是
Request.GetOwinContext().Authentication.authenticationManager.SignOut();
使用其中一个(且仅一个):
Request.GetOwinContext().Authentication.SignOut();
Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);
HttpContext.Current.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);
本文解释了为什么您的Cookie不会被删除:http://dotnet.dzone.com/articles/catching-systemwebowin-cookie
我知道我的答案不是最基于研究的,但说实话,我找不到为什么我提供的代码示例对我有用。我只知道如果你以另一种方式使用SignOut(),System.Web会弄乱Owins cookie。
答案 1 :(得分:2)
这对我有用。如果要使cookie无效,请将其丢入控制器。特别是,我使用它来更新用户的角色,以便用户不必手动注销并重新登录以修复在@if(User.IsInRole("Admin")){...}
下加载的菜单。我希望这对某人有所帮助 - 我花了一段时间来解决这个问题。
var updatedUser = await UserManager.FindByNameAsync(User.Identity.Name);
var newIdentity = await updatedUser.GenerateUserIdentityAsync(UserManager);
AuthenticationManager.SignOut();
AuthenticationManager.SignIn(newIdentity);
答案 2 :(得分:0)
我遵循了上述所有解决方案,但最后我感到困惑,因为用户没有注销。最后我的问题解决了:
Request.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
FederatedAuthentication.SessionAuthenticationModule.SignOut();
因为我使用SessionAuthenticationModule
来保留其中的声明,因此在注销后,用户可以使用app,因为Cookie中存在现有的FedAut。
答案 3 :(得分:0)
<div class="grid-two imageandtext">
<div class="imageandtext image_grid">
<label>
<img src="http://yaitisme.com/images/getImage.jpg" class="img-thumbnail">
<input type="radio" name="selimg">
<span class="caption">
<span>Painting</span>
</span>
</label>
</div>
<div class="imageandtext image_grid">
<label>
<img src="http://yaitisme.com/images/getImage.jpg" class="img-thumbnail">
<input type="radio" name="selimg">
<span class="caption">
<span>Painting</span>
</span>
</label>
</div>
</div>
答案 4 :(得分:0)
关于ASP .Net MVC Logout无效: -
我遇到一个问题,即在生产模式下在IIS上托管的应用程序无法正常使用chrome
尽管它正常运作 - 在所有浏览器中使用Visual Studio Dev托管 - 在IE上的生产模式
我在Startup.Auth.CS中遇到了问题。 确保重复配置不适用于以下内容
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.UseCookieAuthentication((new CookieAuthenticationOptions(.....))
答案 5 :(得分:0)
过去几天,我在一些Microsoft Azure示例中遇到了类似的问题。 解决方法:
public IHttpActionResult Index()
{
HttpContext.Current.GetOwinContext().Authentication.SignOut(
CookieAuthenticationDefaults.AuthenticationType,
OpenIdConnectAuthenticationDefaults.AuthenticationType);
return Ok();
}
答案 6 :(得分:0)
这是最终对我有用的方法。我也解释了我的答案。
答案 7 :(得分:-1)
我让这个工作。这是我做的:
当我调用上面的Logout操作时,我使用了Fiddler,因为我还在测试注销功能。我在里面放了一个断点,是的,该方法被成功调用。它调用authenticationManager.SignOut(),但我的受保护页面仍然有效。
因此,我决定将代码放在客户端中而不是使用Fiddler:
var token = sessionStorage.getItem(tokenKey);
var headers = {};
if (token) {
headers.Authorization = 'Bearer ' + token;
}
$.ajax({
type: 'POST',
url: '/api/Account/Logout',
headers: headers
}).done(function (data) {
self.result("Logout Done!");
}).fail(showError);
将此代码连接到Logout按钮,瞧!受保护的MVC页面现在在单击“注销”按钮后出现预期的401 Unauthorized错误。像往常一样,WebAPI资源也会出现预期的401错误。
它毕竟是有效的,我认为使用Fiddler进行测试的过程会导致问题。但是我无法解释为什么会这样。
感谢阅读。