web-dev-qa-db-fra.com

Authentification des applications et des utilisateurs à l'aide d'ASP.NET Core

Quelqu'un peut-il m'indiquer une bonne documentation ou des informations utiles sur le meilleur moyen d'implémenter l'authentification et l'autorisation pour un API ASP.NET Core REST; je dois d'abord authentifier et autoriser l'application, puis authentifier et autoriser l'utilisateur . 

Idéalement, je veux pouvoir restreindre la méthode du contrôleur à laquelle une application authentifiée et/ou un utilisateur peut accéder. 

Je songe à utiliser AspNet.Security.OpenIdConnect.Serverenter pour l'authentification de l'application, mais je ne suis pas sûr de la meilleure façon de procéder pour l'authentification de l'utilisateur. Peut-être réutiliser l'authentification OpenIdConnect sur un autre noeud final pour les utilisateurs avec un en-tête différent afin de contenir le jeton de l'utilisateur.

Une fois authentifié, je pense simplement à utiliser la sécurité de base des rôles pour limiter les méthodes de contrôleur accessibles.

Est-ce la bonne façon de résoudre ce problème?

22
Michael Edwards

C’est en fait une question plus difficile qu’il peut paraître car le type de clients (clients logiciels) qui utilisent l’API semble déterminer le type d’authentification * requis. Par exemple, dans une application Web, où l'application Web a besoin de l'authentification *, Asp.Net Identity fonctionnerait avec un jeton ou un cookie. Cependant, si d'autres clients vont utiliser les services fournis (applications mobiles, applications WUP, il peut être plus facile à mettre en œuvre à l'aide de l'authentification par jeton. Lorsque j'ai eu ce problème, je me suis aperçu que j'avais un manque de connaissances car je ne Je comprends pas OAuth, il fallait que je revienne à la base.

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

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

La plupart des didacticiels autour de l’identité Asp.Net "semblent" être destinés aux clients Web. Bien qu'il soit possible de trouver ceux qui ne le sont pas. Avec l'introduction d'asp.net core, la syntaxe a changé et bon nombre des anciens didacticiels qui montrent la combinaison de l'authentification par cookie et par jeton ne sont plus applicables. De plus, Web Api n'est plus séparé des autres types de projets dans Visual Studio, ce qui rend la modification encore plus prononcée. Voici quelques tutoriels plus anciens.

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/

Combinez l'utilisation de l'authentification pour les pages MVC et pour les pages Web API?

IdentityServer est une solution tout à fait valide, fonctionne à la fois avec les informations d'identification du client et les informations d'identification du propriétaire de la ressource (utilisateur, mot de passe). Brock Allen a généralement été très réactif dans SO sous la balise.

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

ou sur le site github sous des numéros étiquetés comme des questions

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

Une fois encore, avec le serveur d’identité, je devais revenir à la base et suivre les tutoriels pour comprendre comment cela fonctionnerait dans mon projet.

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

Comme Brock me l'a rapidement fait remarquer dans un autre message, asp.net ef identity est un magasin d'utilisateurs et il est bon de l'utiliser avec le flux de travaux relatif aux informations d'identification du propriétaire de la ressource.

6
Bill

Pour authentication, vous pouvez utiliser ASP.NET Core Identity qui utilisera le package Microsoft.AspNetCore.Identity.EntityFrameworkCore package, qui conservera les données d'identité et le schéma sur SQL Server à l'aide de Entity. Cadre de base .

Pour autorisation, vous pouvez utiliser Autorisation basée sur le rôle qui utilise le package Microsoft.AspNetCore.Authorization .

Vous pouvez également commander cette vidéo pour un aperçu de l'autorisation ASP.NET Core

4
S.Dav

Je ne trouvais pas de bonne documentation à ce sujet, mais je devais atteindre le même objectif. J'ai donc codé moi-même le reste de l'api en modifiant les actions du modèle d'authentification ASP.NET standard en équivalents d'API REST.

Par exemple, voici comment j'ai travaillé sur l'action de connexion:

    // 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);
    }

Si vous appelez l'API à partir d'un javascript depuis un navigateur, les cookies seront chargés et vous devriez pouvoir faire d'autres appels autorisés à l'API. Si vous appelez depuis un autre type de client, vous voudrez vous assurer que le CookieContainer est conservé. pour les appels autorisés.

À partir de ce point, vous pouvez autoriser vos contrôleurs d'API REST à l'aide de [Authorize] par l'intermédiaire des bibliothèques Microsoft standard: https://docs.Microsoft.com/en-us/aspnet/core/security/authentication/identity

Bonne chance.

0
Gary Holland
0
error505
0
user2922221