ASP.NET Web APIでのユーザー認証


150

このトピックは私にとって信じられないほど混乱しています。私はHTTPアプリの新人ですが、どこかからJSONデータを使用するiPhoneクライアントを開発する必要があります。私はMSのWeb APIを選択しましたが、それは十分に簡単に思えたのですが、ユーザーの認証に関しては非常にイライラします。

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

これは問題ではありませんが、これを正確に行う方法の例を求めています。私は以下のページを見てきました。

これらは無許可の要求の処理方法を説明LoginControllerしていますが、ユーザーの資格情報を要求して検証するためののようなものは明確に示していません。

素敵な簡単な例を書いてくれる人、または私を正しい方向に向けてくれる人はいますか?

ありがとう。


1
:私はこれに同じ質問のようなもの答えている stackoverflow.com/questions/11775594/...
cuongle

asp.netを使用したWeb APIの場合、mvcアプリと同じように(必要に応じて)cookieとformsauthenticationモジュールを使用できます。したがって、Web APIコードでプリンシパルをチェックして、たとえばユーザーがログインしているかどうかを確認できます(以前と同じ)。
エリオット


多くの人にasp.net/web-api/overview/security/…の記事を読むことを強くお勧めします。
Youngjae 14

回答:


176

ログイン画面から、数時間のGooglingの後、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サービスに渡す必要があります。

    詳細については、以下の記事をご覧ください。


3
うわー!それが私が答えと呼んでいるものです。結論として。私は次のことを計画しています:1. HTTPSを介してユーザー名とパスワードを受け取り、ログイン結果とトークンを返すLoginメソッドでアカウントコントローラーを作成します。2.クライアントはトークンを保存し、それをWebサーバーによって検証される要求のヘッダー(HTTPSは不要)として送信します。それは良いアプローチですか?次に、私の最後の疑問は、トークンの改ざんと有効期限を制御する方法です。これは可能ですか?
Luis Aguilar

6
@Jupaol私は多くのWeb API開発者の代弁者だと思います。ウェブサイトがなくクライアントがブラウザを使用していないため、フォーム認証を使用できません。また、ユーザーはデバイスのどこにでもいるため、統合認証を使用できません(したがって、Web API)、それで私は何を使うのですか?
markmnl 2014

21
この回答がなぜ多くの賛成票を獲得するのか理解できません。ASP.NET Web APIについてではなく、ASP.NET MVCについてです。
Bastien Vandamme 2014年

3
B413のコメントを繰り返し、この質問では特にWeb APIを要求することを指摘したいと思います
Julien

6
これは、SOで最も投票された「間違った」回答ですか?答えは、実際にはmvc Webアプリケーションとは大きく異なるWeb APIについて語っていません!@ B413のように私は完全にショックを受けています!
stt106 2016

15

ユーザー名とパスワードで認証し、認証Cookie を使用ない場合、MVC4のAuthorize属性はそのままでは機能しません。ただし、次のヘルパーメソッドをコントローラーに追加して、基本認証ヘッダーを受け入れることができます。コントローラのメソッドの最初から呼び出します。

void EnsureAuthenticated(string role)
{
    string[] parts = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(Request.Headers.Authorization.Parameter)).Split(':');
    if (parts.Length != 2 || !Membership.ValidateUser(parts[0], parts[1]))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "No account with that username and password"));
    if (role != null && !Roles.IsUserInRole(parts[0], role))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "An administrator account is required"));
}

クライアント側から、このヘルパーはHttpClient認証ヘッダーを備えたを作成します。

static HttpClient CreateBasicAuthenticationHttpClient(string userName, string password)
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(userName + ':' + password)));
    return client;
}

ヘッダーで資格情報を渡すために業界標準を使用する簡単な方法を探しているとコメントしたかっただけです。この例では、サーバー側とクライアント側の両方の基本を示し、必要なのはこれだけでした。
da_jokker 2017年

9

私はMVC5 / Web APIプロジェクトに取り組んでおり、Web APIメソッドの承認を取得できるようにする必要がありました。インデックスビューが最初に読み込まれると、自動的に作成されると思われる「トークン」Web APIメソッドを呼び出します。

トークンを取得するためのクライアント側コード(CoffeeScript)は次のとおりです。

getAuthenticationToken = (username, password) ->
    dataToSend = "username=" + username + "&password=" + password
    dataToSend += "&grant_type=password"
    $.post("/token", dataToSend).success saveAccessToken

成功すると、次のものが呼び出され、認証トークンがローカルに保存されます。

saveAccessToken = (response) ->
    window.authenticationToken = response.access_token

次に、[Authorize]タグを持つWeb APIメソッドに対してAjax呼び出しを行う必要がある場合は、Ajax呼び出しに次のヘッダーを追加するだけです。

{ "Authorization": "Bearer " + window.authenticationToken }

どこからresponse.access_token来たのか。あなたはc#コードからそれを設定していますか?
shashwat、2014

「応答」オブジェクトは「トークン」メソッドによって返されます。
ProfNimrod 2014

私は役割を調べていません。このアプローチはアクセストークンを提供するだけなので、[Authorize]タグで修飾されたWebApiメソッドを呼び出すことができます。おそらく、これらのメソッドのいずれかを呼び出すと、ロールを確認できます。 stackoverflow.com/questions/19689570/mvc-5-check-user-roleが役立つ場合があります。
ProfNimrod 2014

そして、このソリューションのどこで実際にユーザーを認証しますか?
クレイグブレット

/ tokenエンドポイントは、新しいWeb APIプロジェクトに対して自動的に作成されます。この背後にあるコードは、ユーザーが認証される場所です。既存のMVCプロジェクトにWeb APIコントローラーを追加した場合は、少し複雑になります。
ProfNimrod 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.