我有一个mvc4 Web应用程序,我已经在其中实现了microsoft外部登录。但我的注销无法正常工作。注销我用过 -
WebSecurity.Logout();
Session.RemoveAll();
return RedirectToAction("UserLogin");
但它不起作用。退出后再次单击我的登录按钮时,它会自动使用以前的帐户登录。 请帮忙。
答案 0 :(得分:2)
在尝试使用我的解决方案之前,我想suggest you
使用默认模板打开 MVC应用程序,并检查默认功能如何适用于Login
和{{1} }。
我确定您可以轻松识别您的错误,您将获得解决方案。
另外尝试下面给出的解决方案,我在我的项目中使用它,目前它对我来说很好。
在您的App_Start中:创建类似下面的类
Logout
在你的控制器中:
public class AuthorizeUser : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!httpContext.User.Identity.IsAuthenticated) return false;
return base.AuthorizeCore(httpContext);
}
}
在您的Fillter配置中
[AuthorizeUser]
public class UserController : BaseController<Users>
{
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
FormsAuthentication.SignOut();
return RedirectToAction("UserLogin");
}
}
在Global.ascx中验证:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeUser()); // Register Authorize User
}
}
在您的视图中
protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
JavaScriptSerializer serializer = new JavaScriptSerializer();
if (authTicket.UserData == "OAuth") return;
}
}
您的登录操作结果应在您的控制器中具有<span>
@using (Html.BeginForm("LogOff", "User", FormMethod.Post, new { id = "logoutform" }))
{
@Html.AntiForgeryToken()
<a href="javascript:document.getElementById('logoutform').submit()">Logoff</a>
}
</span>
访问权限:
AllowAnonymous
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult UserLogin(LoginViewModel model, string returnUrl) // Model is optional But return URL is required
{
// Do Stuff
}
表格的第一个/索引调用:
Login
返回网址必须在控制器中:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View(new LoginViewModel());
}
注意:在所有控制器中添加:
private ActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl)) return Redirect(returnUrl);
else return RedirectToAction("UserLogin");
}
祝你好运:)