我々はその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);
}
私たちはASP.NET Core MVCを使用していません。私たちはASP.NET Core with Web APIを使用しています。つまり、コントローラはビューではなくデータを返します。すべてのビューは、Angularおよびui-routerによってクライアントで処理されます。あなたのソリューションは私たちのセットアップで動作しますか?もしそうなら、** context.HespContext.Request.Path = "/"; ** ** context.Result = new RedirectResult( "/"); **という行を変更する必要があります。 – ashilon
あなたのユーザ/クライアントに "index/login pageへの新しいリクエストをする"という "指示"を返すには、何かを返すべきです。あなたのユーザー/クライアントが理解できるもの。何か「文書化されました」(あなたのドキュメント内)。これがなければ( 'Request.Path'を変更するだけで)、あなたのサーバはクライアントではなく、他のものを「行う」ことになります。クライアントは "/ api/create/magic"という呼び出しが実行され、魔法が作成されたと言うことを "考える"だろうが、セッション/資格の有効期限のためにユーザーが承認されていないと真ではない。 Imhoが 'UnauthorizedResult'を返すことは、あなたのケースに対する最良の決定です(私の答えを更新しました)。 – Dmitry