ユーザー認証に次のコードを使用しています
Home Controller:
------------------
[AllowAnonymous]
[HttpPost]
public JsonResult JsonLogin(SecurityDTO usr)
{
var cnt = _ipres.CheckLoginCount(usr);
if (cnt == 1)
{
var logDet = _ipres.GetUser(usr);
if (logDet != null)
{
var dto = new SecurityDTO
{
Id = logDet.Id,
UserName = logDet.username,
Password = logDet.password,
Email = logDet.Emailid,
UTID = logDet.UTID,
};
Session[USER] = dto;
}
if (logDet != null)
{
switch (logDet.UTID)
{
case 1:
Session["UType"] = "admin";
return Json(new { success = true, redirect = Url.Action("Index", "Admin", new { area = "Admin" }) });
case 2:
Session["UType"] = "user";
return Json(new { success = true, redirect = Url.Action("Index", "User", new { area = "User" }) });
case 3:
Session["UType"] = "client";
return Json(new { success = true, redirect = Url.Action("Index", "Client", new { area = "Client" }) });
default:
Session["UType"] = null;
break;
}
}
}
else
{
ModelState.AddModelError("", "Invalid Username or Password");
}
return Json(new { errors = GetErrorsFromModelState() });
}
Base Controller:
------------------
public SecurityDTO UDTO { get; set; }
protected override void OnActionExecuting(ActionExecutingContext act)
{
if (Session["UType"] != null)
{
UDTO = (SecurityDTO)Session[HomeController.USER];
base.OnActionExecuting(act);
}
else
act.Result = RedirectToAction("Index", "Home", new { area = "" });
}
これは、認証に非常に適しています。ログインに成功したら、ユーザーのタイプに応じてユーザーをエリアにリダイレクトします。エリア内のすべてのコントローラーは、ベース コントローラーを実装します。最近、次の理由により、これが効果的ではないことがわかりました。ユーザーとしてログインすると、URL は ~/AppName/User/User/ViewName になります。しかし、URL を改ざんして ~/AppName/Admin/Admin/ViewName に変更すると、管理者ユーザーでなくてもそのページに移動します。まだユーザーとしてログインしていますが、すべての管理機能にアクセスできます。基本的に、URL のユーザー タイプを変更すると、そのユーザー タイプと見なされます。ただし、意図した動作は、このような URL 改ざんが発生したときに、ユーザーをログイン ページにリダイレクトすることです。ベースコントローラーでユーザータイプの変更を認識し、ユーザーをログインページにリダイレクトするようなことはできますか? これを行う正しい方法を示してください...