Обязательно ли использовать RedirectToAction
при вызове действия контроллера из другого действия? В настоящее время я просто вызываю их напрямую, потому что не хочу, чтобы они возвращались, и поэтому я пропускаю тег Authorize для одного из моих действий (которое делает то, что я хочу).
Можете ли вы сообщить мне, если это плохая форма, и если да, я должен создать несколько новых действий для установки файлов cookie клиента или просто установить их непосредственно в LogOn()
Действие?
Могу ли я вместо этого сделать SwitchClient
приватным, а затем сделать общедоступное Авторизованное действие, которое будет использоваться только Администраторами на стороне клиента? Затем частное действие вызывается через действие LogOn
, но к нему нельзя получить доступ, если пользователи не аутентифицированы как администраторы.
Вот мой код:
[HttpGet]
[CustomAuthorizeAccess(Roles = "Administrator", RedirectResultUrl = "Unauthorized")]
public ActionResult SwitchClient(string client)
{
if (Request.Cookies["Client"] == null)
{
HttpCookie clientCookie = new HttpCookie("Client", client);
Response.Cookies.Add(clientCookie);
}
else
{
Response.Cookies["Client"].Value = client;
}
return new RedirectResult(Request.UrlReferrer.AbsolutePath);
}
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
FormsService.SignIn(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
//Add user's role to cookies (assumes each user only has one role)
string role = Roles.GetRolesForUser(model.UserName).First();
HttpCookie roleCookie = new HttpCookie("Role", role);
if (role == "client1")
{
SwitchClient("client1");
}
else if (role == "client2")
{
SwitchClient("client2");
}
else if (role == "Administrator" || role == "client3")
{
SwitchClient("client3");
}
//Make role cookie persistent for 7 days
//if user selected "Remember Me"
if (model.RememberMe)
{
roleCookie.Expires = DateTime.Today.AddDays(7);
}
if (Response.Cookies["Role"] != null)
{
Response.Cookies["Role"].Value = null;
Response.Cookies.Remove("Role");
}
Response.Cookies.Add(roleCookie);
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}