0

ajaxからのリダイレクトを適切に処理するために、このPrevent Forms認証に従いました。ただし、特定の属性がこの呼び出しが行われたアクションを装飾しているかどうかを判断できるようにする必要があります。これは、場合によってのみ行いたいためです。このメソッド内でアクセス可能なHttpRequestオブジェクトからこの情報を取得できますか?

基本的に、上記のコードから操作したい部分を取り出します。

public class SuppressFormsAuthenticationRedirectModule : IHttpModule {

  private void OnPostReleaseRequestState(object source, EventArgs args) {
      var context = (HttpApplication)source;
      var response = context.Response;
      var request = context.Request; // request is HttpRequest

      if (response.StatusCode == 401 && request.Headers["X-Requested-With"] == 
        "XMLHttpRequest") {

        // TODO HERE:  Check that the controller action contains a particular attribute
        //             and if so do not suppress redirect
        SuppressAuthenticationRedirect(context.Context);
      }
  }
  }

更新: このコードは、コンパイルされた DLL プロジェクト内に保持され、ホスト MVC アプリケーション (アクセスできない) に組み込まれていることに注意してください。その場合、アプリケーションの残りのコントローラーに影響を与えないことを確認できない限り、デフォルトの実装を変更することはできません。

4

1 に答える 1

1

できるだけ多くのフレームワークを使用しようとしたため、DefaultControllerFactory から GetControllerType メソッドを公開することにしました。routeData には、エリア、コントローラー、およびアクションが含まれていることがわかります。そのため、少し反映することで、派生コントローラー ファクトリを作成する必要がなくなります。

これは間違いなく本番環境に対応していません。これは、要求されたアクションからカスタム属性を取得する方法にすぎません。

編集: 現在のコントローラー ファクトリを設定する代わりに、新しい DerivedControllerFactory を作成します。

var httpApplication = (HttpApplication)sender;
var httpContext = new HttpContext(httpApplication.Request, new HttpResponse(new StringWriter()));
var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
//var factory = ControllerBuilder.Current.GetControllerFactory() as DerivedControllerFactory;
var factory = new DerivedControllerFactory();
var controllerType = factory.GetControllerType(new RequestContext(new HttpContextWrapper(httpContext), routeData), routeData.Values["controller"].ToString());
var methodInfo = controllerType.GetMethod(routeData.Values["action"].ToString());
var attributes = methodInfo.GetCustomAttributes(true);  

public class DerivedControllerFactory : DefaultControllerFactory
{
   public new Type GetControllerType(RequestContext requestContext, string controllerName)
   {
      return base.GetControllerType(requestContext, controllerName);
   }
}
于 2012-12-07T16:47:06.117 に答える