0

C# で Web MVC4 を初めて使用する基本的な質問で申し訳ありません...

C#/SQL で作成したアプリケーションの Web インターフェイスを作成しています。MVC4 フレームワークを SQL DB にアタッチできました。今、AD のグループ メンバーシップに基づいて人々ができることを保護したいと考えています。web.config で認証を「Windows」に設定すると、ログインしている User.Identity.Name が正しく表示されます。だから私はそれが現在ログインしているユーザーを引き上げていることを知っています。さらに、Android または iPad デバイスの場合、Active Directory ドメイン外のユーザーを認証できる必要があります。私はまだそこまで行っていません...ほとんどの場合、可能であればログインしたユーザーを自動認証し、存在しない場合はユーザー名/パスワードの入力を求めたいと思います。

わかりました。また、AD でユーザーのグループ メンバーシップを取得する方法も既に知っています。しかし、その AD クエリを実行し、その情報を各ページからアクセスできる場所に保存する必要があります。次に、各ページでその変数にアクセスするにはどうすればよいですか?

たとえば、アクセス権がない場合はメニュー オプションを表示したくないため、変数を使用して、保護されているメニュー オプションを表示または非表示にする必要があります。また、誰かが手動でそこに行こうとしてもできないように、Web ページにもそのセキュリティを追加する必要があると思います。

セキュリティ上の理由から、セッション変数を使用したくないと思います..

以前は Adob​​e Flex でシングルトンを使用してセッション状態を管理していました。私はそこで検索を行いましたが、人々はおそらく C# では良い考えではないと言っています。とにかく、これの多くの例はありません...

これを行うために何をしていますか?

4

1 に答える 1

0

これが私がお勧めするものです。ActiveDirectoryMembershipProvider Classの例を探し始めます。この MembershipProvider をフォーム認証と組み合わせると、ユーザーを認証するための安全なシステムが提供されます。

認証が完了したら、 Active Directory ロール プロバイダー (ADRP) (ユーザー グループを決定するため) とMVC アプリケーションを保護する標準的な方法を組み合わせて、ユーザーがリソースにアクセスすることを承認する必要があります。

開始するために、ADRP を使用するように拡張できる場合に、これらの単純な拡張メソッドを作成しました (ADRP を使用したことがないため)。

public static class IPrincipalExtensions
{
        private static _adminName = "Administrator";

    public static bool IsAnonymous(this IPrincipal instance)
    {
        return (instance == null);
    }

    public static bool IsAdminOrInRole(this IPrincipal instance, string role)
    {
        if (instance == null
            || instance.Identity == null
            || !instance.Identity.IsAuthenticated)
        {
            return false;
        }

        bool result = instance.IsInRole(role)
                      || instance.IsInRole(IPrincipalExtensions._adminName));

        return result;
    }

}

次に、デフォルトのAuthorizeAttibuteを拡張して、管理者専用に使用できる属性を提供しました。

public class AuthorizeAdministratorAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null)
        {
            throw new ArgumentNullException("httpContext");
        }

        bool result = false;
        IPrincipal user = httpContext.User;

        if (user.Identity.IsAuthenticated)
        {
            result = user.IsAdmin();
        }

        return result;
    }
}

これは、my で提供されているのと同じ拡張メソッドを使用するIPrincipalExtensionsので、繰り返しません。次の 2 つの行が等しいため、これは行き過ぎだと感じる人もいるかもしれません。

[Authorize("Administrator")]
[AuthorizeAdministrator]

ただし、最初の例は文字列を使用しているため、単純なタイプミスでアクセスが拒否され、役割/グループ名を「管理者」に変更すると、さらに難しくなります。したがって、グループが変更された場合に 2 番目のものを使用すると (厳密に型指定されていると主張できます)、1 つの場所で名前を変更するだけで済みます。

于 2012-11-20T17:33:14.207 に答える