2017-05-03 7 views
1

ngが-含ま: ログインページ使用している間、私はセッションと認証タイムアウトの次のコードを使用してい

public class AuthCheckService : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (HttpContext.Current.Session.Count == 0 || HttpContext.Current.Session["NovellID"] == null || HttpContext.Current.Session["UserRole"] == null) 
     { 

      if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       //Ajax request doesn't return to login page, it just returns 403 error. 
       filterContext.HttpContext.Response.Clear(); 
       filterContext.HttpContext.Response.StatusCode = 501; 
       throw new ModelStateException("Your Session has expired- Please login again!"); 
      } 
      else 
      { 
       //base.HandleUnauthorizedRequest(filterContext); 
       filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { action = "Login", controller = "Account" })); 
      } 

     } 
     else if (filterContext.HttpContext.Request.IsAuthenticated) 
     { 
      // Otherwise the reason we got here was because the user didn't have access rights to the 
      // operation, and a 403 should be returned. 
      filterContext.Result = new HttpStatusCodeResult(403); 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 

    } 

} 

public class SessionCheckService : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (HttpContext.Current.Session.Count == 0 || HttpContext.Current.Session["NovellID"] == null || HttpContext.Current.Session["UserRole"] == null) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Response.Clear(); 
       filterContext.HttpContext.Response.StatusCode = 501; 
       throw new ModelStateException("Your Session has expired- Please login again!"); 
      } 
      else 
      { 
       // HttpContext.Current.Response.Redirect(Helper.SiteURL + "Account/Login"); 
       //filterContext.Result = new RedirectResult(Helper.SiteURL + "Account/Login"); 
       // return; 
       //base.OnActionExecuting(filterContext); 
       filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { action = "Login", controller = "Account" })); 
      } 
     } 
     base.OnActionExecuting(filterContext); 

    } 
} 

が、セッションの

は、私は次のような画面を取得しています有効期限が切れます。

Login screen coming in Partial view

私は角使用しています。セッションを期限切れにしてからOpen Edit Overdue Tasksをクリックすると、上記の画面が表示されます。

HTML:

<div ng-app="myApp"> 
    <div ng-controller="AdminController"> 
     <div class="container"> 
      @Html.AntiForgeryToken() 
      <section class="full-length mtop10"> 
       <div class="ui-tabs ui-widget ui-widget-content"> 
        <div class="area-top clearfix" id="TaskListButtons"> 
    <div class="return-pop-btn1"> 

          <input type="button" value="Edit Overdue Tasks" class="btn-primary i-editoverdue" ng-click="OpenEditOverdueTasks()" id="EditOverdueTasks"> 
         </div> 
</div> 

       <div class="clearFix"></div> 
      </section> 
     </div> 

<div id="popupView" ng-include="template.url"> 
     </div> 
    </div> 
</div> 

JS:

(function() { 
//var myApp = angular.module("AdminModule", ['ui.grid', 'ui.grid.pagination', 'ui.grid.selection', 'ui.grid.edit']); 
var app = angular.module('myApp'); 
app.controller('AdminController', ['$scope', 'uiGridConstants', function ($scope, uiGridConstants) { 
$scope.templates = [ 
     { name: 'TaskForm', url: 'Template/taskform' }, 
     { name: 'taskassignment', url: 'Template/taskassignment' }, 
     { name: 'export', url: 'Template/export' }, 
     { name: 'blank', url: 'Template/blank' }, 
     { name: 'maintenanceplan', url: 'Template/maintenanceplandetails' }, 
     { name: 'editoverduetasks', url: 'Template/editoverduetasks' }, 
    ]; 

    $scope.OpenEditOverdueTasks = function() { 
     showProgress(); 
     $scope.template = $scope.templates[5]; 
     window.setTimeout(function() { 
      //localStorage.removeItem('hdnIsEditOverDue'); 
      if($('#EditOverDuePopup').length == 1) 
      { 
       $('#EditOverDuePopup').css('display', 'block'); 
       $('#exposeMaskEditOverDue').css('display', 'block'); 
       //hideProgress(); 
      } 
      else 
      { 
       window.setTimeout(function() { 
        $('#EditOverDuePopup').css('display', 'block'); 
        $('#exposeMaskEditOverDue').css('display', 'block'); 
        //hideProgress(); 
       }, 4000); 
      } 
     }, 5000); 
    }; 
}]); 
})(); 

間違ったつもりされた場合、私に知らせてください。

+2

[セッションの有効期限が切れるとログインページへの部分的な表示をリダイレクトする]の可能な複製(http://stackoverflow.com/questions/38475165/redirect-partial-view-to-login-page-when-session-expires) – User3250

+0

ここに私はAjaxセッションのタイムアウトのために従っています。http://www.adambielecki.com/2014/04/prevent-displaying-log-in-page-in.html – Anil

答えて

0

インターセプタを使用して解決策を得ました。

Main.js:

(function() { 
'use strict'; 
angular.module("myApp", ['ui.grid', 'ui.grid.pagination', 'ui.grid.selection', 'ui.grid.edit', 'lr.upload']); 
angular.module('myApp').config(['$httpProvider', function ($httpProvider) { 
    var interceptor = ['$q', '$window', '$location', '$injector', function ($q, $window, $location, $injector) { 
     return { 
      request: function (config) { 
       config.headers = config.headers || {}; 
       if ($window.sessionStorage.token) { 
        config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token; 
       } 
       return config; 
      }, 

      requestError: function (rejection) { 
       return $q.reject(rejection); 
      }, 

      response: function (response) { 
           var responseHeaders; 
           responseHeaders = response.headers(); 
           var content = responseHeaders["content-type"]; 

           if (content!=undefined && content 
             .indexOf("text/html") !== -1 
            && response.data 
            && response.data 
             .indexOf('<meta name="unauthorized" content="true">') !== -1) { 
            $window.location.reload(); 
            return $q.reject(response); 
           } 
           return response; 
      } 
     }; 
    }]; 

    $httpProvider.interceptors.push(interceptor); 
}]); 

})(); 

Login.cshtml:login.cshtmlで 私はそこにメタタグを追加しました。

<meta name="unauthorized" content="true"> 

これは他の人に役立つことを望みます。

0

例:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
public class UserAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var isAuthorized = base.AuthorizeCore(httpContext); 

     // return httpContext.Session != null && httpContext.Session.Count != 0; 
     return isAuthorized; 

    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new HttpUnauthorizedResult(); 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Response.StatusCode = 401; 
       filterContext.HttpContext.Response.End(); 
      } 
      else 
      { 
       filterContext.Result = new RedirectToRouteResult(LoginRougte()); 
      } 

     } 
     else if (!Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole)) 
     { 

      filterContext.Result = new HttpUnauthorizedResult(); 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Response.StatusCode = 401; 
       filterContext.HttpContext.Response.End(); 
      } 
      else 
      { 
       filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary 
       { 
        {"action", "Index"}, 
        {"controller", "Login"}, 
        {"area", ""} 
       }); 
       filterContext.Result = new RedirectToRouteResult(LoginRougte()); 
      } 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 


    } 

    private RouteValueDictionary LoginRougte() 
    { 
     return new RouteValueDictionary 
        { 
         {"action", "Index"}, 
         {"controller", "Login"}, 
         {"area", ""} 
        }; 
    } 
} 

うまくいけば、それはあなたのための作業です。

+0

いいえ運:-)。私はちょうど変更された質問を確認してください。 – Sunny

+0

@Sunnyごめんなさい。私は今日私が作ってテストする完全な事例を書いています。これをお試し下さい。 – Ashiquzzaman

関連する問題