数時間のグーグル検索の後、ログイン画面から ApiController メソッドで Authorize 属性を使用するまで、ユーザーを認証する方法の明確な例を見つけることができなかったことに驚いています。
これは、次の 2 つの概念について混乱しているからです。
認証は、システムがユーザーを安全に識別するためのメカニズムです。認証システムは、次の質問に対する答えを提供します。
- ユーザーは誰ですか?
- ユーザーは本当に自分自身を表す人物ですか?
承認は、システムによって制御される保護されたリソースに対して、特定の認証済みユーザーが必要とするアクセス レベルをシステムが決定するメカニズムです。たとえば、データベース管理システムは、特定の特定の個人にデータベースから情報を取得する機能を提供するが、データベースに格納されているデータを変更する機能を提供せず、他の個人にはデータを変更する機能を提供するように設計されている場合があります。認証システムは、次の質問に対する答えを提供します。
- ユーザー X はリソース R へのアクセスを許可されていますか?
- ユーザー X は操作 P を実行する権限がありますか?
- ユーザー X はリソース R に対して操作 P を実行する権限がありますか?
Authorize
MVCの属性は、アクセス ルールを適用するために使用されます。次に例を示します。
[System.Web.Http.Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
return View();
}
上記のルールは、管理者ロールとスーパー ユーザーロールのユーザーのみがメソッドにアクセスできるようにします。
location
これらのルールは、要素を使用して web.config ファイルで設定することもできます。例:
<location path="Home/AdministratorsOnly">
<system.web>
<authorization>
<allow roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
ただし、これらの承認規則が実行される前に、現在の Web サイトで認証を受ける必要があります。
これらは不正なリクエストを処理する方法を説明していますが、LoginController のようなものや、ユーザーの資格情報を要求して検証するようなものを明確に示していません。
ここから、問題を 2 つに分けることができます。
同じ Web アプリケーション内で Web API サービスを使用するときにユーザーを認証する
ASP.Netの認証に依存するため、これが最も簡単な方法です。
これは簡単な例です:
Web.config
<authentication mode="Forms">
<forms
protection="All"
slidingExpiration="true"
loginUrl="account/login"
cookieless="UseCookies"
enableCrossAppRedirects="false"
name="cookieName"
/>
</authentication>
ユーザーはアカウント/ログインルートにリダイレクトされ、そこでカスタム コントロールをレンダリングしてユーザーの資格情報を要求し、次を使用して認証 Cookie を設定します。
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
クロスプラットフォーム認証
このケースは、Web アプリケーション内で Web API サービスのみを公開しているため、サービスを使用する別のクライアントがあり、クライアントは別の Web アプリケーションまたは任意の .Net アプリケーション (Win フォーム、WPF、コンソール、Windows サービス、等)
たとえば、同じネットワーク ドメイン (イントラネット内) 上の別の Web アプリケーションから Web API サービスを使用するとします。この場合、ASP.Net が提供する Windows 認証を利用できます。
<authentication mode="Windows" />
サービスがインターネット上に公開されている場合は、認証されたトークンを各 Web API サービスに渡す必要があります。
詳細については、次の記事を参照してください。