1

似たような質問がたくさんありますが、これは私を困惑させました。

[Authorize] を使用した場合、ユーザー名とパスワードの入力を求められますが、[InternalAuthorizeV2] を使用した場合は入力しません

今のところ特別なことは何もしないカスタム AuthorizeAttribute があります (間違っている可能性があることを制限しています)。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class InternalAuthorizeV2Attribute: AuthorizeAttribute
    {}

そしてコントローラーのアクション

   [InternalAuthorizeV2(Roles = "MobileApps_Parkingggg")]
         public ActionResult Index()
         {
             var model = new VmParking();
             return View(model);
         }

ログインは別のアプリで処理されますが、同じ Web 構成行があります

   <machineKey compatibilityMode="Framework20SP2" validationKey="editedOut" decryptionKey="editedOut" validation="SHA1" decryption="AES"/>
      <authentication mode="Forms">
          <forms name="emLogin" loginUrl="/Login/Index" timeout="540" protection="All" path="/"  enableCrossAppRedirects="true"  cookieless="UseCookies" />
      </authentication>
    <sessionState timeout="540" />

[Authorize] のページに移動してログインし、トラブル ページに戻ると、ユーザー名は表示されますが、顧客属性を呼び出しているようには見えません。

新しい情報: 多くのアプリで使用されているため、私の属性は共有 DLL にあります。csファイルをWebプロジェクトにコピーするとうまくいくようです。理由はわかりませんが、まだヒントやヒントを探しています。

4

1 に答える 1

4

あなたが言ったことから、 を使用してもし[Authorize]なくても、すべて正常に動作します[InternalAuthorizeV2]

共有 dll が正しく設定されていれば、違いはありません。私は同じことが働いています。System.Web.Mvc, v4.0.0.0Web プロジェクトが最新バージョンの dll を使用していることと、私のプロジェクトの共有 dll に正しいアセンブリ参照があることを確認してください。

多くのアプリで使用されていると思いますか? すべてのアプリで共有 dll に同じ問題がありますか、それともそのうちの 1 つだけですか? 1 つだけの場合は、問題のあるリファレンスを確認してください。

以下のテストですべてが機能する場合、最終的なオプションは、dll の authorize 属性で行っていることが、そのアプリの適切なコンテキストを取得していないか、適切なメンバーシップ プロバイダーまたはデータベースを使用していないことです。属性内で使用しているコードが問題を引き起こしているかどうかを判断するのは困難です。

依存関係をテストする

共有 dll にベース認証属性を追加してから、作成したばかりのベース属性を継承する別の認証属性を Web プロジェクトに実装してみてください。これは、共有 dll が正しく設定されていることを示しているはずです。

// in the dll:
public class BaseAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute { ... }

// in the web project:
public class InternalAuthorizeV2Attribute : BaseAuthorizeAttribute { ... }

単純に dll プロジェクトから Web プロジェクトに移動するだけで問題が解決する場合、最も可能性の高い問題は、Web プロジェクトが正しいバージョンの dll を使用していないか (クリーニングして完全な再構築を実行してください)、または dll が間違った dll を参照していることです。System.Web.Mvc.AuthorizeAttribute。_ あなたはトリプルチェックしたと言っていますが、上記のデバッグを試すことは、これが本当に当てはまるかどうかを判断するのに役立ちます.

認証メソッドの呼び出しをデバッグする

それが機能しない場合は、次のオーバーライド メソッドを非常に単純な属性に追加して、 への呼び出しでブレークポイントに到達するかどうかを確認してくださいbase.OnAuthorization。そうでない場合は、問題の原因となっている実際の属性ではない可能性があります。

[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method, 
  Inherited = true, AllowMultiple = true)]
public class InternalAuthorizeV2Attribute : System.Web.Mvc.AuthorizeAttribute {
  protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) {
    return false; // breakpoint here, and this should force an authorization failure
  }
  public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
  {
    base.OnAuthorization(filterContext); // breakpoint here
  }
}

これにより、アクションへのユーザー アクセスが完全に防止されます。それが機能しない場合は、問題が属性にあるのではなく、属性が適用されていないことがわかります。

以下をコントローラーに追加して、authorize 属性の前にヒットすることを確認することもできます。

protected override void OnAuthorization(AuthorizationContext filterContext) {
    base.OnAuthorization(filterContext);
}

認可チェーン

属性が Action メソッドにアタッチされているため、チェーンの前の認証属性 (グローバルフィルターまたはコントローラー属性など) がユーザーの認証をまだ妨げていない場合にのみヒットすることに注意してください (こちらの回答を参照してください)。 )、またはチェーンが Action 属性に到達するのを止める ActionResult を時期尚早に返します。ただし、単に dll からプロジェクトに移動するだけで機能する場合、これが問題になる可能性はほとんどありません。同様に、AllowAnonymousあなたが言ったことから間違った場所にいる可能性は低いです。

于 2013-06-19T13:20:31.813 に答える