9

クライアントが呼び出して使用できる多くの Web メソッドを提供する Web API アプリケーションがあります。IIS でホストされ、SSL がセットアップされます。

ユーザー資格情報は Active Directory に保存されますが、クライアントはドメイン内だけでなく、世界中のどこにでもある可能性があるため、Windows 統合認証を使用できないことを理解しています。

上記で説明したように、シナリオでユーザーを認証する最良の方法は何ですか?

ユーザーが行うすべてのリクエストで、ヘッダーにユーザー名/パスワードを渡すようにユーザーに依頼する必要がありますか? 次に、プログラムで Active Directory に対してユーザー資格情報を検証します (それを行うコンポーネントが既にあります)。たとえば、各アクションが実行される前に実行されるカスタム ActionFilter を作成しますか?

別のアプローチは、すべてのリクエストの前に実行され、認証を行い、無効な場合はリクエストを中止する HttpModule を作成することです。

私のカスタム属性は次のようになります。

 public class ActiveDirectoryAuthAttribute : ActionFilterAttribute
    {
        // todo: load from config which can change depending on deployment environment
        private static readonly bool ShouldRequireHttps = false;

        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            IPrincipal principal = this.Authentiate(actionContext);

            if (principal == null)
            {
               actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
            }
            else
            {
                this.SetPrincipal(principal);
            }
        }

        private IPrincipal Authentiate(HttpActionContext actionContext)
        {
            if (IsUriSchemaValid(actionContext.Request.RequestUri))
            {
                // is the client certificate known and still valid?
                // is IP valid?
                // find user credentials and validate against AD
                // create the Principle object and return it
            }

            return null;
        }

        private void SetPrincipal(IPrincipal principal)
        {
            Thread.CurrentPrincipal = principal;

            if (HttpContext.Current != null)
            {
                HttpContext.Current.User = principal;
            }
        }

        private static bool IsUriSchemaValid(Uri uri)
        {
            bool result = true;

            if (ShouldRequireHttps)
            {
                if (!string.Equals(uri.Scheme, "https", StringComparison.InvariantCultureIgnoreCase))
                {
                    result = false;
                }
            }

            return result;
        }
    }

次に、コントローラー アクション内で、Principle オブジェクトにアクセスできます。

IPrincipal principle = this.User;

上記で説明したように、シナリオでユーザーを認証/承認する最良の方法は何ですか?

上記では、IPrinciple からオブジェクトを作成する方法を教えてください。既存の .NET クラスはありますか、それともカスタム クラスを作成する必要がありますか?

4

1 に答える 1

3

私は最近ADでかなりのことをしてきましたが、正直に言うと、これを処理する別の方法は考えられません.

OAuth タイプのアプローチを使用する方が理にかなっています。最初にユーザー名とパスワードを取得し、自己作成および暗号化されたトークンを呼び出し先に返すトークン タイプのルートを提供します。最初の最初の呼び出しが行われると、呼び出し先にトークンが返され、API への後続の呼び出しごとに Authorization ヘッダーでそのトークンを使用できます。

トークンは、1 回の呼び出しまたは非常に短い時間有効です。トークンを使用すると判断されるたびに、別のトークンを発行してください。

また、カスタム OAuth 実装を使用して、認証プロセスにデータベースを使用するのではなく、AD アイデンティティ ストアを使用し、OAuth ベアラー トークンを利用することも検討できます。SSL を使用しているため、実際にはこれがシナリオに適しています。

于 2013-05-13T07:32:11.247 に答える