1

Windows 認証によって保護されている Web アプリケーションがあります。ただし、誰でもグローバルに使用できるようにする必要があるコントローラーが 1 つあるため、アクセスを許可するためにサーバー上の Windows アカウントは必要ありません。

IISでWindows認証と匿名認証の両方を有効にすることで、これが機能するようになりました。私のコントローラーは次のようになります。

[Authorize]
public class MyController : Controller
{
    public Index()
    {
    }

    public DoStuff()
    {
    }

    etc...
}

私の匿名コントローラーは同じですが、最初から [Authorise] 属性を削除しました。

これは、匿名アクセスを許可したいコントローラーを除いて、Windows アカウントを持つユーザーのみがコントローラーの大部分を使用できるように Web アプリケーションに指示するということで正しいでしょうか?

問題なく動作しているように見えますが、これを行うことで大きなセキュリティ ホールが開いたままになっていないことを確認したかったのですか?

両方の認証方法を有効にし、この方法でアプリケーションを設定することに問題はありますか?

4

1 に答える 1

0

まず第一に、あなたのやり方では、あなたのアプリケーションのセキュリティに大きな穴はなく、期待通りに動作します。しかし、もっと良い方法があります...

Authorize 属性の問題は、アプリケーションに追加する新しいコントローラーを忘れがちであり、追加しないと、コントローラーが公開されてしまうことです。

MVC 4 を使用していた場合は、Authorize 属性をグローバル フィルターとして追加し、匿名コントローラーで AllowAnonymous 属性を使用できます。これは、Authorize 属性がデフォルトで AllowAnonymous 属性を尊重するためです。一方、MVC 3 には、AllowAnonymous 属性が付属していません。T

回避策は、次のようにプロジェクトで AllowAnonymous 属性を自分で作成することです。

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

これで、組み込みの Authorize 属性からサブクラス化してカスタマイズし、コントローラーに適用される Anonymous 属性を探すことができます。属性が見つかった場合は、承認をスキップできます。実装例を次に示します。

public sealed class AuthorizeWithAnonymousSupportAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
            || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true);
            if (!skipAuthorization)
            {
                base.OnAuthorization(filterContext);
            }
        }
    }

この属性をサイトのグローバル フィルターに追加する必要があります。Global.asax で:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
    filters.Add(new AuthorizeWithAnonymousSupportAttribute ());
    filters.Add(new HandleErrorAttribute());
}

さあ、最後のステップです。匿名にしたいコントローラーに AllowAnonymous 属性を追加するだけです。

[AllowAnonymous]
public class MyController : Controller
{
    public Index()
    {
    }

    public DoStuff()
    {
    }

    etc...
}

上記のすべてを実行する利点は、アプリケーションに追加するコントローラーに Authorize 属性を設定することを心配する必要がないことです。代わりに、どのコントローラーが公開されているかをアプリケーションに明示的に伝える必要があります。

ありがとう、これが役立つことを願っています。

于 2012-10-04T20:09:05.803 に答える