0

我々はそのOnActionExecuting方法でアクションフィルタ、(つまり、後に多くのセッションからの許可を得て、)いくつかの認証テストを実行ActionAuthorizationFilterAttributeを、持っている、とテストが正常であれば返すだけで、そうでなければForbidResultをコンテキストの結果プロパティに設定します。ここまでは順調ですね。しかし、私たちはセッションが何らかのアイドル時間後にパーミッションのためにヌルを再試行するケースが1つあり、ユーザーが手動で行うのではなく、"/"にリクエストパスを設定する必要があります。 http://mydomain/mywebapp/someurlのようにセッションが終了した後にURLにアクセスしようとすると、メソッドは彼をhttp://mydomain/mywebapp/に戻す必要があり、アプリケーションはセッションの初期設定を再開します。これは手でこれを行うが、それは方法では動作しません。ここではメソッドのコードは次のとおりです。コードにPathを変更アクションフィルタの変更要求パスに

public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     var path = context.HttpContext.Request.Path.Value.Trim().ToLower(); 
     var session = context.HttpContext.Session; 
     var permittedUrls = session.GetJson<List<string>>(SesstionStateKeys.PermittedUrls); 

     if (permittedUrls == null) 
     { 
      context.HttpContext.Request.Path = "/"; 
      return; 
     } 

     if (permittedUrls.Any(url => path.Contains(url.Trim().ToLower()))) 
     { 
      return; 
     } 

     context.Result = new ForbidResult(); //new UnauthorizedResult(); 

     base.OnActionExecuting(context); 
    } 

答えて

0

は新しいパスにユーザーをリダイレクトしません。ユーザーがインデックス/ログインページにリダイレクトされるようにするには、RedirectResultを返す必要があります。

APIの最適なオプションはUnauthorizedResultです。

+0

私たちはASP.NET Core MVCを使用していません。私たちはASP.NET Core with Web APIを使用しています。つまり、コントローラはビ​​ューではなくデータを返します。すべてのビューは、Angularおよびui-routerによってクライアントで処理されます。あなたのソリューションは私たちのセットアップで動作しますか?もしそうなら、** context.HespContext.Request.Path = "/"; ** ** context.Result = new RedirectResult( "/"); **という行を変更する必要があります。 – ashilon

+0

あなたのユーザ/クライアントに "index/login pageへの新しいリクエストをする"という "指示"を返すには、何かを返すべきです。あなたのユーザー/クライアントが理解できるもの。何か「文書化されました」(あなたのドキュメント内)。これがなければ( 'Request.Path'を変更するだけで)、あなたのサーバはクライアントではなく、他のものを「行う」ことになります。クライアントは "/ api/create/magic"という呼び出しが実行され、魔法が作成されたと言うことを "考える"だろうが、セッション/資格の有効期限のためにユーザーが承認されていないと真ではない。 Imhoが 'UnauthorizedResult'を返すことは、あなたのケースに対する最良の決定です(私の答えを更新しました)。 – Dmitry

0
public override void OnActionExecuting(ActionExecutingContext context) 
{ 
    var path = context.HttpContext.Request.Path.Value.Trim().ToLower(); 
    var session = context.HttpContext.Session; 
    var permittedUrls = session.GetJson<List<string>>(SesstionStateKeys.PermittedUrls); 

    if (permittedUrls == null) 
    { 
     context.Result = new RedirectResult("your_url"); 
     return; 
    } 

    if (permittedUrls.Any(url => path.Contains(url.Trim().ToLower()))) 
    { 
     return; 
    } 

    context.Result = new ForbidResult(); //new UnauthorizedResult(); 

    base.OnActionExecuting(context); 
} 
+0

ありがとう、あなたはivamax9しかし、この解決策は動作しません。たぶん、asp.netコアコントローラをWeb APIコントローラとして使用しているからです。 – ashilon

関連する問題