wake-up-neo.com

Anwendungs- und Benutzerauthentifizierung mit ASP.NET Core

Kann mir jemand eine gute Dokumentation verraten oder gute Informationen dazu geben, wie man die Authentifizierung und Autorisierung für eine ASP.NET Core REST - API am besten implementiert. Ich muss erst die App authentifizieren und autorisieren und dann den Benutzer authentifizieren und autorisieren . 

Idealerweise möchte ich die Controller-Methode einschränken, auf die eine authentifizierte App und/oder ein Benutzer zugreifen kann. 

Ich denke über die Verwendung von AspNet.Security.OpenIdConnect.Serverenter für die App-Authentifizierung nach, aber ich bin mir nicht sicher, wie die Benutzerauthentifizierung am besten durchgeführt werden soll. Möglicherweise verwenden Sie die OpenIdConnect-Authentifizierung an einem anderen Endpunkt erneut für Benutzer mit einem anderen Header, um das Benutzertoken zu enthalten.

Nach der Authentifizierung denke ich nur daran, die Rollensicherheit zu verwenden, um die Zugriffsmethoden der Controller einzuschränken.

Ist dies der richtige Weg, um dieses Problem zu lösen?

22
Michael Edwards

Dies ist in der Tat eine schwierigere Frage, die möglicherweise so aussieht, weil die Art der Clients (Software-Clients), die die API verwenden, die Art von auth * zu bestimmen scheinen. In einer Webanwendung, in der die Webanwendung auth * benötigt, funktioniert Asp.Net Identity beispielsweise mit einem Token oder einem Cookie. Wenn jedoch andere Clients die bereitgestellten Dienste in Anspruch nehmen (mobile Apps, WUP-Apps), ist es möglicherweise einfacher, die Token-Authentifizierung zu implementieren. Als ich dieses Problem hatte, bin ich auf das Problem gestoßen, dass ich eine Wissenslücke hatte, weil ich nicht wusste Ich verstehe OAuth nicht wirklich, ich musste wieder auf die Grundlagen zurückgreifen.

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

https://www.pluralsight.com/courses/oauth2-json-web-tokens-openid-connect-einführung

Die meisten Tutorials rund um Asp.Net Identity scheinen auf Web-Clients ausgerichtet zu sein. Es ist zwar möglich, diejenigen zu finden, die es nicht sind. Mit der Einführung von asp.net core hat sich die Syntax geändert und viele der alten Lernprogramme, die die Kombination von Cookie- und Token-Authentifizierung zeigen, sind nicht mehr anwendbar. Darüber hinaus unterscheidet sich Web Api nicht mehr von anderen Projekttypen in Visual Studio, wodurch die Änderung noch deutlicher wird. Hier sind einige ältere Tutorials.

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/

Kombinieren Sie die Authentifizierung sowohl für MVC-Seiten als auch für Web-API-Seiten?

IdentityServer ist eine vollständig gültige Lösung, die sowohl mit Client-Berechtigungsnachweisen als auch mit Berechtigungsnachweisen für Ressourceninhaber (Benutzer, Kennwort) arbeitet. Brock Allen war in SO unter dem Tag normalerweise sehr ansprechend

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

oder auf der github-Site unter Fragen, die als Fragen gekennzeichnet sind

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

Mit dem Identitätsserver musste ich wieder auf die Grundlagen zurückgreifen und die Tutorials durcharbeiten, um zu verstehen, wie dies in meinem Projekt funktionieren würde.

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

Wie Brock in einem anderen Beitrag schnell auf mich aufmerksam machte, ist asp.net ef identity ein Benutzerspeicher und gut für den Workflow des Ressourceninhabers geeignet.

6
Bill

Für authentication können Sie ASP.NET Core Identity verwenden, das das Paket Microsoft.AspNetCore.Identity.EntityFrameworkCore verwendet, das die Identitätsdaten und das Schema unter Verwendung von in SQL Server speichert Framework Core .

Für authentication können Sie Rollenbasierte Autorisierung verwenden, die das Paket Microsoft.AspNetCore.Authorization verwendet.

Sie können auch dieses Video zur Übersicht über die ASP.NET Core-Autorisierung auschecken

4
S.Dav

Ich konnte keine gute Dokumentation zu diesem Thema finden. Allerdings musste ich dasselbe erreichen, also habe ich den Rest des API selbst codiert, indem ich die Aktionen in der Standard-Authentifizierungsvorlage von ASP.NET auf REST API-Entsprechungen änderte.

So habe ich zum Beispiel die Login-Aktion durchgeführt:

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

Wenn Sie die API über ein Javascript in einem Browser aufrufen, werden die Cookies geladen und Sie sollten in der Lage sein, weitere autorisierte Aufrufe der API durchzuführen. Wenn Sie von einem anderen Client-Typ aus anrufen, sollten Sie sicherstellen, dass der CookieContainer beibehalten wird für autorisierte Anrufe.

Ab diesem Punkt können Sie Ihre REST API-Controller mithilfe des [Authorize] -Dekorators über die Standard-Microsoft-Bibliotheken autorisieren: https://docs.Microsoft.com/en-us/aspnet/core/security/authentication/Identität

Viel Glück.

0
Gary Holland

Hier ist es: Ein Workshop zum Durchlaufen der verschiedenen neuen Elemente in der ASP.NET-Kernautorisierung:

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

https://github.com/blowdart/AspNetAuthorizationWorkshop

0
error505
0
user2922221