Est-il nécessaire d'utiliser RedirectToAction
lors de l'appel d'une action du contrôleur à partir d'une autre action? Je les appelle directement directement parce que je ne veux pas qu'ils reviennent, et ainsi je contourne la balise Authorize pour une de mes actions (ce qui fait ce que je veux). Pouvez-vous s'il vous plaît laissez-moi savoir si c'est une mauvaise forme, et si oui, dois-je créer plusieurs nouvelles actions pour définir les cookies du client ou simplement les définir directement dans l'action LogOn()
? Puis-je à la place rendre SwitchClient
privé, puis effectuer une action Autorisée publique à utiliser uniquement par les administrateurs côté client? Ensuite, l'action privée est appelée via l'action LogOn
, mais elle n'est pas accessible à moins que les utilisateurs ne soient authentifiés en tant qu'administrateurs.Autorisation MVC3: est-ce une mauvaise forme d'appeler une action autorisée à partir d'une autre action?
Voici mon code:
[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);
}
Est-ce que cela contourne l'autorisation? Si oui alors - absolument pas le faire. Il existe une différence entre les méthodes internes et externes (que ce soit public/privé ou exposé/non-exposé à un service). –
Dans la mesure où je peux le dire, il contourne, car dans l'action 'LogOn()', j'ai déjà appelé 'FormsService.SignIn (model.UserName, model.RememberMe);' avant d'appeler le 'SwitchClient' (et cela fonctionne pour n'importe quel client, peu importe s'ils sont le rôle de 'Administrator' ou pas –