asp.net mvc 身分識別驗證中返回絕對路徑的ReturnUrl

來源:互聯網
上載者:User

在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();
        }
    }

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.