クライアントが呼び出して使用できる多くの 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 クラスはありますか、それともカスタム クラスを作成する必要がありますか?