使用 ASP.NET Core 的应用程序和用户身份验证

Posted

技术标签:

【中文标题】使用 ASP.NET Core 的应用程序和用户身份验证【英文标题】:Application and User Authentication using ASP.NET Core 【发布时间】:2017-05-16 00:42:31 【问题描述】:

任何人都可以向我指出一些好的文档或提供有关为 ASP.NET Core REST API 实现身份验证和授权的最佳方法的良好信息。我需要先对应用程序进行身份验证和授权,然后对用户进行身份验证和授权。

理想情况下,我希望能够限制经过身份验证的应用程序和/或用户可以访问的控制器方法。

我正在考虑使用AspNet.Security.OpenIdConnect.Serverenter 进行应用程序身份验证,但我不确定如何最好地执行用户身份验证。可能会在不同的端点上为具有不同标头的用户重用 OpenIdConnect 身份验证以包含用户令牌。

一旦通过身份验证,我正在考虑使用基于角色的安全性来限制可以访问哪些控制器方法。

这是解决这个问题的正确途径吗?

【问题讨论】:

我发现this 很有帮助,但不确定它是否是您正在寻找的东西。 我会说Stateless 是要走的路。本质上,您需要在每个请求中发送身份验证有效负载数据,这将允许您确定请求可以访问和不能访问的内容。看到这个:developerhandbook.com/c-sharp/… @MichaelEdwards 我之前刚刚在同一件事上悬赏过,请参阅此question 及其答案 【参考方案1】:

我在这方面找不到任何好的文档,但是我必须实现相同的目标,因此我自己编写了其余 api,方法是将标准 ASP.NET 身份验证模板中的操作修改为 REST 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/core/security/authentication/identity

祝你好运。

【讨论】:

【参考方案2】:

对于身份验证,您可以使用ASP.NET Core Identity,它将使用Microsoft.AspNetCore.Identity.EntityFrameworkCore 包,该包将使用Entity Framework Core 将身份数据和架构持久保存到SQL Server。

对于授权,您可以使用使用Microsoft.AspNetCore.Authorization 包的Role Based Authorization。

您还可以查看this video 以了解有关 ASP.NET Core 授权的概述

【讨论】:

【参考方案3】:

这实际上是一个更棘手的问题,因为使用 api 的客户端(软件客户端)的类型似乎决定了需要什么样的 auth*。例如,在 Web 应用程序中,Web 应用程序需要 auth*,那么 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 的教程“似乎”都是面向 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/

Combine the use of authentication both for MVC pages and for Web API pages?

IdentityServer 是一个完全有效的解决方案,可与客户端凭据和资源所有者凭据授予(用户、密码)一起使用,并且 Brock Allen 通常在标记下的 SO 中响应非常迅速

https://***.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 身份是一个用户存储,非常适合与资源所有者凭据工作流一起使用。

【讨论】:

我将使用 Identity Server 4 支持该动议 - 我们使用它为多个域提供一个身份验证提供程序【参考方案4】:

请参考以下链接。

对于 Asp.net Core https://stormpath.com/blog/token-authentication-asp-net-core

对于 API https://stormpath.com/blog/rest-api-mobile-dotnet-core

【讨论】:

欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的内容您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.【参考方案5】:

这里是: 了解 ASP.NET Core 授权中的各种新内容的研讨会:

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

【讨论】:

以上是关于使用 ASP.NET Core 的应用程序和用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章

带有 Angular 6 的 Asp.Net Core 2.1 中的 Windows 身份验证 - Chrome 连续登录提示

使用 ASP.NET Core 的应用程序和用户身份验证

VS 2017 ASP.NET Core Web 应用程序和个人用户帐户有效,但页面不存在

如何在我的 asp.net core 3.1 应用程序中播种用户和角色?

使用 ASP.NET Core Identity 3 的用户角色权限

ASP.NET Core Windows 身份验证和应用程序角色