Asp.NetMvc認証、異常処理、権限検証(ブロッカー)実装コード
4615 ワード
1、ユーザーログイン
ユーザーがログインに成功したかどうかを検証する手順は直接無視され、ユーザーがログインに成功した後、現在のユーザーログイン情報(session,cookie)をどのように保存するかを説明します.本稿では、認証(実はcookieベース)について説明します.コードを見てみましょう.
ネーミングスペースの導入
using System.Web.Security;
では、クッキーでアイデンティティ情報を再取得し、復号してユーザーエンティティに逆シーケンス化すればOKです.
ここではMVCのactionブロッキング(OnActionExecutingの書き換え)を使用し、actionが実行される前にブロッキングのコードを実行します.ここでは、認証が期限切れになったかどうかも確認できます.
3、異常処理上HomeControllerはControllerを継承するのではなく、私たちが定義したBaseControllerを継承します.では、BaseControllerに何が書かれているか見てみましょう.
インスタンスコード
著者:LyIng.Net
ユーザーがログインに成功したかどうかを検証する手順は直接無視され、ユーザーがログインに成功した後、現在のユーザーログイン情報(session,cookie)をどのように保存するかを説明します.本稿では、認証(実はcookieベース)について説明します.コードを見てみましょう.
ネーミングスペースの導入
using System.Web.Security;
Users ModelUser = new Users() { ID = 10000, Name = UserName, UserName = UserName, PassWord = PassWord, Roles = "admin" };//
string UserData = SerializeHelper.Instance.JsonSerialize(ModelUser);//
// ,
FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.Now.AddHours(12), false, UserData);
HttpCookie Cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(Ticket));// , Cookie
Response.Cookies.Add(Cookie);
現在、アイデンティティ情報はクッキーに保存されていますが、シーンで現在のユーザーのユーザーIDや他の情報が必要な場合はどうすればいいですか?では、クッキーでアイデンティティ情報を再取得し、復号してユーザーエンティティに逆シーケンス化すればOKです.
///
///
///
///
public Users GetUser()
{
if (HttpContext.Current.Request.IsAuthenticated)//
{
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];// cookie
FormsAuthenticationTicket Ticket = FormsAuthentication.Decrypt(authCookie.Value);//
return SerializeHelper.Instance.JsonDeserialize(Ticket.UserData);//
}
return null;
}
2、権限検証ここではMVCのactionブロッキング(OnActionExecutingの書き換え)を使用し、actionが実行される前にブロッキングのコードを実行します.ここでは、認証が期限切れになったかどうかも確認できます.
///
///
///
public class AuthAttribute : ActionFilterAttribute
{
///
///
///
public string Code { get; set; }
///
/// (action )
///
///
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
ContentResult Content = new ContentResult();
Content.Content = string.Format("alert(' !');window.location.href='{0}'; ", FormsAuthentication.LoginUrl);
filterContext.Result = Content;
}
else
{
string[] Role = CheckLogin.Instance.GetUser().Roles.Split(',');//
if (!Role.Contains(Code))//
{
//
ContentResult Content = new ContentResult();
Content.Content = "alert(' !');history.go(-1); ";
filterContext.Result = Content;
}
}
}
}
ではactionではどのように呼び出しますか?ここにHomeControllerのコードを貼ってみましょう.
public class HomeController : BaseController
{
[AuthAttribute(Code = "admin")]// ( action admin )
public ActionResult Index()
{
Users ModelUser = CheckLogin.Instance.GetUser();
return View(ModelUser);
}
[AuthAttribute(Code = "user")]//
public ActionResult Index2()
{
return View();
}
[AuthAttribute(Code = "admin")]// ,
public ActionResult Index3()
{
return View();
}
}
これでactionに権限を制御できます.3、異常処理上HomeControllerはControllerを継承するのではなく、私たちが定義したBaseControllerを継承します.では、BaseControllerに何が書かれているか見てみましょう.
[ErrorAttribute]
public class BaseController : Controller
{
// Controller BaseController,
}
ここでBaseControllerは、ErrorAttributeのエラーブロッカーを1つ追加しただけで、Controllerで発生した異常がErrorAttributeで処理される限り、データベースなどに記録することができます.では、ErrorAttributeがどのように働いているかを見てみましょう.
///
/// (Controller )
///
public class ErrorAttribute : ActionFilterAttribute, IExceptionFilter
{
///
///
///
///
public void OnException(ExceptionContext filterContext)
{
// ,
Exception Error = filterContext.Exception;
string Message = Error.Message;//
string Url = HttpContext.Current.Request.RawUrl;//
filterContext.ExceptionHandled = true;
filterContext.Result = new RedirectResult("/Error/Show/");//
}
}
ここでは異常をキャプチャし、フレンドリーなエラープロンプトページにジャンプできます.MVCではいくつかの操作がこのように簡単に完了し、コードについては文章の下でダウンロードを提供します.インスタンスコード
著者:LyIng.Net