Я использовал шаблон MVC в приложении и изменил его по мере необходимости.При нажатии кнопки «Выход» я должен быть в состоянии выполнить действие выхода из системы, где я определяю логику выхода из системы.Но когда я нажимаю кнопку, она сразу выводит меня на экран входа в систему, не затрагивая действие выхода из системы в контроллере.
Я попытался добавить ссылку действия и указать явное указание для достижения действия выхода из системы, но оно также не сработало.,Если я удалю это действие, оно выдаст ошибку, что оно не найдено.Я проверил в инструменте fiddler, и это действие вызывается при нажатии кнопки и перенаправляется на вход в систему, но точка останова никогда не срабатывает или, если я изменяю содержимое внутри действия выхода из системы, оно не отражается.Я также попытался использовать другое имя для того же действия, никаких изменений в поведении обнаружено не было.
Вот представление и действие контроллера.
// POST: /Account/LogOff
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
//AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Login", "Account");
}
Частичное представление, встроенное в макет:
@if (1==1)
{
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" }))
{
@Html.AntiForgeryToken()
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<p class="navbar-text">Allturna's Insights Portal</p>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li>
<p class="navbar-text">Hello!</p> @*Use username here from viewdata*@
</li>
<li>
<li>
@Html.ActionLink("Tenants", "GetTenant", "Home", new { ReturnUrl = ViewBag.ReturnUrl }, null)
</li>
<li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
<li><img src="~/Content/Image/Allturna_logo.png" height="50" width="220" /></li>
</ul>
</div>
}
}
RouteConfig.cs выглядит следующим образом:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }
);
}
}
Мне не удалось выяснить, почему кнопка выхода из системы может нажать кнопку / отправить формуне доходить до выхода из системы.Буду признателен за любую помощь.
Поскольку я работаю над этим, я хотел добавить некоторые дополнительные заметки.Если я использую шаблон aspnet по умолчанию с идентификатором, он достигает кнопки выхода из системы.Но я пытаюсь реализовать свою собственную логику входа и выхода без использования Identity.Вот когда то не выйдет из системы.
Я разместил обе логические (с / без идентификатора) обращения к выходу из системы, как и ожидалось.
С Identity работает следующее:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
//Add tenantId to session from user info (temporary testing with Allturna)
Session["TenantId"] = 1;
Session["AccessToken"] = "my token";
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
, когда я использую следующую логику входа в систему (без идентификации), при выходе из системы не происходит попадание.
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
//get the authentication URL
string strJwtToken = string.Empty;
string strAuthenticationUrl = ConfigurationManager.AppSettings.Get("AuthenticationServerEndPoint");
if (String.IsNullOrEmpty(strAuthenticationUrl))
throw new Exception("Authentication Endpoint is not specified.");
ServiceClient client = new ServiceClient(strAuthenticationUrl, "Authenticate");
dynamic objAuthentication = new ExpandoObject();
objAuthentication.UserName = model.Email;
objAuthentication.Password = model.Password;
client.AddJsonBody(objAuthentication);
HttpStatusCode httpReturnCode = client.Post(out strJwtToken);
if (httpReturnCode == HttpStatusCode.OK)
Session["AccessToken"] = strJwtToken;
return RedirectToLocal(returnUrl);
}
IМне нужно было бы понять, что делает каркас идентификации / SignInManager, что отсутствует в моей логике, и как я могу добавить это в свою логику и заставить выход из системы работать правильно.Заранее спасибо.