MVC 5 Owin CAS注销操作未注销

时间:2017-06-06 19:40:37

标签: c# authentication asp.net-mvc-5 owin cas

我正在尝试在我的MVC 5应用程序中实现noelbundick's CAS authentication for Owin,但有一点扭曲。我们希望这是您登录或退出的唯一方式,因此我们在没有身份验证的情况下启动了应用程序,并使用this tutorial设置了所有身份验证,同时使用了内置外部身份验证的其他新解决方案就像比较我正在做的事情一样。

所以我用CAS的东西把所有谷歌的东西都换掉了,一切都很好,除了某些原因,退出按钮不起作用。具体来说,这里的行动

// POST: /Account/LogOff
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
    return RedirectToAction("Index", "Home");
}

似乎跳过SignOut()函数,直接转到RedirectToAction()。我会给你一些可能有用的代码,但我真的不确定还能提供什么帮助。第一段中的引用包含我使用的所有代码,以及Visual Studio在具有外部身份验证的基本MVC站点上提供的任何默认代码。

身份验证管理器:

private IAuthenticationManager AuthenticationManager
{
    get { return HttpContext.GetOwinContext().Authentication; }
}

Startup.Auth.cs

private void ConfigureAuth(IAppBuilder app)
{
    var cookieOptions = new CookieAuthenticationOptions
    {
        LoginPath = new PathString("/Account/Login")
    };
    app.UseCookieAuthentication(cookieOptions);
    app.SetDefaultSignInAsAuthenticationType(cookieOptions.AuthenticationType);
    CasAuthenticationOptions casOptions = new CasAuthenticationOptions()
    {
        CasServerUrlBase = "https://cas.ourserver.com/cas"
    };
    app.UseCasAuthentication(casOptions);
}

Startup.cs

public void Configuration(IAppBuilder app)
{
    ConfigureAuth(app);
}

ChallengeResult:

private class ChallengeResult : HttpUnauthorizedResult
{
    public ChallengeResult(string provider, string redirectUri)
    {
        LoginProvider = provider;
        RedirectUri = redirectUri;
    }
     public string LoginProvider { get; set; }
     public string RedirectUri { get; set; }
     public override void ExecuteResult(ControllerContext context)
    {
        var properties = new AuthenticationProperties() { RedirectUri = RedirectUri };
        context.HttpContext.GetOwinContext()
            .Authentication.Challenge(properties, LoginProvider);
    }
}

要明确,我不需要它来注销CAS服务器,只需要注册网站。如果CAS cookie仍然存在则没问题。问题是它仍然说“欢迎,用户!”并在顶部“注销”。

请告诉我,如果还有什么我能给你的帮助。我已经搜索了所有内容,无法在线或在StackOverflow上找到解决方案,但这可能是因为我没有谷歌正确的条款,所以这也是受欢迎的。

1 个答案:

答案 0 :(得分:1)

我正在尝试一百万种不同的解决方案,而且根据我目前的代码

// POST: /Account/LogOff
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    //AuthenticationManager.SignOut(
    //  DefaultAuthenticationTypes.ApplicationCookie, 
    //  DefaultAuthenticationTypes.ExternalCookie);
    //Session.Abandon();
    //return RedirectToAction("Index", "Home");

    HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
    HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Response.Cache.SetNoStore();

    Session.Clear();
    Session.Abandon();
    Session.RemoveAll();
    FormsAuthentication.SignOut();
    return RedirectToAction("Index", "Home");
 }

当我将其更改回上面的原始LogOff操作时,它突然发挥作用。遗憾!