Asp.NetMvc認証、異常処理、権限検証(ブロッカー)
12715 ワード
Asp.NetMvc認証、異常処理、権限検証(ブロッカー)
この質問は主にaspを紹介する.Netの認証メカニズムとasp.NetMVCブロッキングのプロジェクトでの運用.次に、ユーザーログイン権限検証の例外処理という簡単なプロセスをシミュレートします.
1、ユーザーログイン
ユーザーがログインに成功したかどうかを検証する手順は直接無視され、ユーザーがログインに成功した後、現在のユーザーログイン情報(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、権限検証
ユーザーがログインに成功したかどうかを検証する手順は直接無視され、ユーザーがログインに成功した後、現在のユーザーログイン情報(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ではいくつかの操作がこのように簡単に完了し、コードについては文章の下でダウンロードを提供します.
インスタンスコード
[ErrorAttribute]
public class BaseController : Controller
{
// Controller BaseController,
}