1. ホーム
  2. asp.net

[解決済み] ASP.NET Web APIでのユーザー認証

2022-04-28 02:45:38

質問

このトピックは、私にとって信じられないほど分かりにくいものでした。私はHTTPアプリケーションの初心者ですが、どこからかJSONデータを消費するiPhoneクライアントを開発する必要があります。私はMSからWeb APIを選択しました、それは十分に簡単に見えたからですが、ユーザーを認証することになると、物事は非常にイライラします。

ログイン画面でのユーザー認証の方法から Authorize 属性の上に ApiController メソッドを数時間かけてググった結果

これは質問ではなく、具体的にどうすればいいのかの例を教えてほしいという要望です。以下のページを拝見させていただきました。

これらは不正なリクエストを処理する方法を説明するものであるにもかかわらず、これらのデモでは LoginController などで、ユーザーの認証情報を求め、それを検証します。

どなたか簡単な例を書いてくださるか、正しい方向を示してくださる方、お願いします。

ありがとうございます。

解決方法は?

<ブロッククオート

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

それは、あなたがこの2つの概念を混同しているからです。

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

    • ユーザーは誰ですか?
    • ユーザーは本当に自分を表現している人なのか?
  • 認証とは、システムが制御する安全なリソースに対して、認証された特定のユーザーがどのレベルのアクセスを持つべきかを決定するメカニズムです。例えば、データベース管理システムは、ある特定の個人にはデータベースから情報を取り出す能力を与え、データベースに保存されているデータを変更する能力は与えないが、他の個人にはデータを変更する能力を与えるように設計することができる。権限付与システムは、このような疑問に対する答えを提供するものです。

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

Authorize 属性は、MVCにおけるアクセスルールの適用などに使用されます。

 [System.Web.Http.Authorize(Roles = "Admin, Super User")]
 public ActionResult AdministratorsOnly()
 {
     return View();
 }

上記のルールでは のユーザは 管理者 スーパーユーザー ロールを使用してメソッドにアクセスします。

これらのルールは、web.config ファイルで location 要素を使用します。例

  <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>
    
    

    ユーザーは アカウント/ログイン ルートで、ユーザー認証情報を要求するカスタムコントロールをレンダリングし、認証クッキーを設定します。

        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 Forms、WPF、コンソール、Windowsサービスなど)である可能性があります。

    例えば、同じネットワークドメイン内(イントラネット内)の別のWebアプリケーションからWeb APIサービスを消費すると仮定すると、この場合、ASP.Netが提供するWindows認証に依存することができるだろう。

    <authentication mode="Windows" />
    
    

    インターネット上に公開されているサービスの場合、各Web APIサービスに認証済みトークンを渡す必要があります。

    詳しくは、以下の記事をご覧ください。