web-dev-qa-db-ja.com

ASP.NET Coreを使用したアプリケーションとユーザーの認証

ASP.NET Core REST APIの認証と承認を実装する最良の方法について、誰かが私にいくつかの優れたドキュメントを指摘したり、優れた情報を提供したりできます。最初にアプリを認証して承認する必要があります。ユーザーを認証および承認します。

理想的には、認証されたアプリやユーザーがアクセスできるコントローラーメソッドを制限できるようにしたいです。

アプリ認証に AspNet.Security.OpenIdConnect.Serverenter を使用することを考えていますが、ユーザー認証を実行する最善の方法がわかりません。ユーザートークンを含めるために、異なるヘッダーを持つユーザーが別のエンドポイントでOpenIdConnect認証を再利用する可能性があります。

認証されたら、ロールベースのセキュリティを使用して、アクセスできるコントローラメソッドを制限することを考えています。

これはこの問題を解決する正しいルートですか?

23
Michael Edwards

これは、APIを使用しているクライアント(ソフトウェアクライアント)のタイプが、必要なauth *の種類を決定するように見えるため、実際には難しい質問です。たとえば、Webアプリケーションでauth *が必要なWebアプリケーションでは、Asp.Net IdentityはトークンまたはCookieのいずれかで機能します。ただし、他のクライアントが提供されたサービス(モバイルアプリ、WUPアプリ)を利用する場合は、トークン認証を使用して実装する方が簡単な場合があります。この問題が発生したとき、私は知識ギャップがあったため、 OAuthがよくわかりません。基本に戻らなければなりませんでした。

https://alexbilbie.com/guide-to-oauth-2-grants/

https://www.pluralsight.com/courses/oauth2-json-web-tokens-openid-connect-introduction

Asp.Net Identity "Seem"に関するチュートリアルのほとんどは、Webクライアント向けです。ないものを見つけることは可能ですが。 asp.netコアの導入により、構文が変更され、Cookieとトークン認証の組み合わせを示す古いチュートリアルの多くは適用されなくなりました。さらに、Web APIはVisual Studioの他のプロジェクトタイプから分離されなくなったため、変更がさらに顕著になります。ここにいくつかの古いチュートリアルがあります。

http://satvasolutions.com/combine-asp-net-identity-web-api-and-mvc-best-in-a-single-web-app/

http://blog.iteedee.com/2014/03/asp-net-identity-2-0-cookie-token-authentication/

MVCページとWeb APIページの両方で認証の使用を組み合わせますか?

IdentityServerは完全に有効なソリューションであり、クライアント資格情報とリソース所有者資格情報の付与(ユーザー、パスワード)の両方で機能し、ブロックアレンは通常、タグの下でSO

https://stackoverflow.com/questions/tagged/identityserver4

またはgithubサイトの質問としてラベル付けされた問題

https://github.com/IdentityServer/IdentityServer4/issues

アイデンティティサーバーを使用して、もう一度、基本に戻ってチュートリアルを実行し、プロジェクトでこれがどのように機能するかを理解する必要がありました。

https://identityserver4.readthedocs.io/en/release/intro/big_picture.html

Brockが別の投稿ですぐに私に指摘したように、asp.net ef IDはユーザーストアであり、リソース所有者の資格情報ワークフローで使用するのに適しています。

6
Bill

authenticationの場合、 ASP.NET Core Identity を使用できます。これは、 Microsoft.AspNetCore.Identity.EntityFrameworkCore パッケージを使用します。 Entity Framework Core を使用して、IDデータとスキーマをSQL Serverに永続化します。

authorizationの場合、 Microsoft.AspNetCore.Authorization パッケージを使用する Role Based Authorization を使用できます。

ASP-NETコア認証の概要については、 このビデオ をチェックアウトすることもできます。

4
S.Dav

これに関する適切なドキュメントは見つかりませんでしたが、同じことを達成する必要があったので、標準のASP.NET認証テンプレートのアクションをREST APIに変更して、残りのAPIを自分でコーディングしました同等。

たとえば、ここでは、ログインアクションの動作方法を示します。

    // POST: /Account/Login
    [HttpPost("[action]")]
    [AllowAnonymous]
    public async Task<ReturnValue<ApplicationUser>> Login([FromBody] loginModel login)
    {
        if (ModelState.IsValid)
        {
            ApplicationUser user = await _userManager.FindByEmailAsync(login.email);

            if (user == null)
            {
                return new ReturnValue<ApplicationUser>(false, "Login failed, check username and password.", null);
            }
            // else if (user.EmailConfirmed == false)
            // {
            //     return new ReturnValue<ApplicationUser>(true, "Confirm email address.", null, user);
            // }
            else
            {
                // This doesn't count login failures towards account lockout
                // To enable password failures to trigger account lockout, set lockoutOnFailure: true
                var result = await _signInManager.PasswordSignInAsync(user, login.password, (bool)login.rememberMe, lockoutOnFailure: false);
                if (result.Succeeded)
                {
                    return new ReturnValue<ApplicationUser>(true, user);
                }
                //if (result.RequiresTwoFactor)
                //{
                //    return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
                //}
                if (result.IsLockedOut)
                {
                    return new ReturnValue<ApplicationUser>(false, "The account is locked out.", null);
                }
            }
        }
        else
        {
            string message = string.Join("; ", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage));
            return new ReturnValue<ApplicationUser>(false, "Invalid login attempt: " + message, null);
        }

        // If we got this far, something failed in the model.
        return new ReturnValue<ApplicationUser>(false, "Login failed.", null);
    }

ブラウザ内のJavaScriptからAPIを呼び出すと、Cookieが読み込まれ、APIへの許可された呼び出しを行うことができるはずです。別のタイプのクライアントから呼び出す場合は、CookieContainerが保持されるようにする必要があります。許可された呼び出し。

この時点から、標準のMicrosoftライブラリを介して[Authorize]デコレーターを使用してREST APIコントローラーを認証できます: https://docs.Microsoft.com/en-us/aspnet/コア/セキュリティ/認証/アイデンティティ

幸運を。

0
Gary Holland

ここにあります:ASP.NET Core Authorizationのさまざまな新しい部分を移動するためのワークショップ:

https://blogs.msdn.Microsoft.com/webdev/2016/03/15/get-started-with-asp-net-core-authorization-part-1-of-2/

https://github.com/blowdart/AspNetAuthorizationWorkshop

0
error505

以下のリンクをご参照ください。

Asp.net Coreの場合 https://stormpath.com/blog/token-authentication-asp-net-core

APIの場合 https://stormpath.com/blog/rest-api-mobile-dotnet-core

0
user2922221