151

This topic has been incredibly confusing for me. I am a rookie in HTTP apps but need to develop an iPhone client that consumes JSON data from somewhere. I chose Web API from MS because it seemed easy enough but when it comes to authenticating users, things get quite frustrating.

I am amazed how I've not been able to find a clear example of how to authenticate an user right from the login screen down to using the Authorize attribute over my ApiController methods after several hours of Googling.

This is not a question but a request for an example of how to do this exactly. I have looked at the following pages:

Even though these explain how to handle unauthorized requests, these do not demonstrate clearly something like a LoginController or something like that to ask for user credentials and validate them.

Anyone willing to write a nice simple example or point me in the right direction, please?

Thanks.

4

3 に答える 3

176

数時間のグーグル検索の後、ログイン画面から ApiController メソッドで Authorize 属性を使用するまで、ユーザーを認証する方法の明確な例を見つけることができなかったことに驚いています。

これは、次の 2 つの概念について混乱しているからです。

  • 認証は、システムがユーザーを安全に識別するためのメカニズムです。認証システムは、次の質問に対する答えを提供します。

    • ユーザーは誰ですか?
    • ユーザーは本当に自分自身を表す人物ですか?
  • 承認は、システムによって制御される保護されたリソースに対して、特定の認証済みユーザーが必要とするアクセス レベルをシステムが決定するメカニズムです。たとえば、データベース管理システムは、特定の特定の個人にデータベースから情報を取得する機能を提供するが、データベースに格納されているデータを変更する機能を提供せず、他の個人にはデータを変更する機能を提供するように設計されている場合があります。認証システムは、次の質問に対する答えを提供します。

    • ユーザー X はリソース R へのアクセスを許可されていますか?
    • ユーザー X は操作 P を実行する権限がありますか?
    • ユーザー X はリソース R に対して操作 P を実行する権限がありますか?

AuthorizeMVCの属性は、アクセス ルールを適用するために使用されます。次に例を示します。

 [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 サービスに渡す必要があります。

    詳細については、次の記事を参照してください。

于 2012-07-31T02:32:48.893 に答える