在asp.net mvc進行身分識別驗證只用在需要驗證的Action或者Controller上標記一個[authorization]即可,如果使用者沒有登陸,此時將返回的ActionResult是HttpUnauthorizedResult
public class HttpUnauthorizedResult : ActionResult {
public override void ExecuteResult(ControllerContext context) {
if (context == null) {
throw new ArgumentNullException("context");
}
// 401 is the HTTP status code for unauthorized access - setting this
// will cause the active authentication module to execute its default
// unauthorized handler
context.HttpContext.Response.StatusCode = 401;
}
}
從HttpUnauthorizedResult的源碼可以看出,HttpUnauthorizedResult的執行很簡單,就是設定當前的HttpContext.Response的狀態代碼為401,這樣就回啟用authentication module 執行它預設的 unauthorized handler,也就是跳轉到登陸頁面的,但是預設的跳轉ReturnURL 參數的地址是相對的,這在不同網域名稱下實現單點登入時顯然是不能滿足我的需要的。
解決的辦法就是繼承AuthorizeAttribute這個特性,重寫OnAuthorization方法
public class ClientAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectResult(
string.Concat(FormsAuthentication.LoginUrl,
"?ReturnUrl=",
filterContext.HttpContext.Server.UrlEncode(filterContext.HttpContext.Request.Url.AbsoluteUri)));
}
}
}
使用的時候在需要身分識別驗證的Action或者Controller上標記上我們自訂的這個ClientAuthorizeAttribute就行了。
例如:
[HandleError]
[ClientAuthorize(Roles = "Admin")]
public class AdminController : Controller
{
//
// GET: /Admin/
public ActionResult Index()
{
return View();
}
}
在asp.net mvc進行身分識別驗證只用在需要驗證的Action或者Controller上標記一個[authorization]即可,如果使用者沒有登陸,此時將返回的ActionResult是HttpUnauthorizedResult
public class HttpUnauthorizedResult : ActionResult {
public override void ExecuteResult(ControllerContext context) {
if (context == null) {
throw new ArgumentNullException("context");
}
// 401 is the HTTP status code for unauthorized access - setting this
// will cause the active authentication module to execute its default
// unauthorized handler
context.HttpContext.Response.StatusCode = 401;
}
}
從HttpUnauthorizedResult的源碼可以看出,HttpUnauthorizedResult的執行很簡單,就是設定當前的HttpContext.Response的狀態代碼為401,這樣就回啟用authentication module 執行它預設的 unauthorized handler,也就是跳轉到登陸頁面的,但是預設的跳轉ReturnURL 參數的地址是相對的,這在不同網域名稱下實現單點登入時顯然是不能滿足我的需要的。
解決的辦法就是繼承AuthorizeAttribute這個特性,重寫OnAuthorization方法
public class ClientAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectResult(
string.Concat(FormsAuthentication.LoginUrl,
"?ReturnUrl=",
filterContext.HttpContext.Server.UrlEncode(filterContext.HttpContext.Request.Url.AbsoluteUri)));
}
}
}
使用的時候在需要身分識別驗證的Action或者Controller上標記上我們自訂的這個ClientAuthorizeAttribute就行了。
例如:
[HandleError]
[ClientAuthorize(Roles = "Admin")]
public class AdminController : Controller
{
//
// GET: /Admin/
public ActionResult Index()
{
return View();
}
}