使用ASP.NET Core进行应用程序和用户认证

24

请问有没有人能提供关于如何在ASP.NET Core REST API中实现身份验证和授权的好文档或者信息?我需要先对应用程序进行身份验证和授权,然后再对用户进行身份验证和授权。

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

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

一旦经过身份验证,我打算只使用基于角色的安全性来限制可以访问哪些控制器方法。

这是解决这个问题的正确路线吗?


我发现这篇文章非常有帮助,不确定它是否符合你的需求。 - Eduard Braun
我认为无状态(Stateless)是最好的选择。实质上,您需要在每个请求中发送身份验证有效载荷数据,这将允许您确定请求可以访问什么和不能访问什么。请参见:http://www.developerhandbook.com/c-sharp/create-restful-api-authentication-using-web-api-jwt/ - scgough
@MichaelEdwards 我之前就为同样的问题发布了赏金,请查看这个问题以及它的答案。 - johnny 5
5个回答

7
这实际上是一个更棘手的问题,因为使用 API 的客户端(软件客户端)似乎驱动了需要什么类型的身份验证。例如,在 Web 应用程序中,如果 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的教程“似乎”都是针对Web客户端设计的。尽管可以找到一些不是这样的教程。随着asp.net core的引入,语法已经改变,许多旧教程显示组合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是一个完全有效的解决方案,可以使用客户端凭据和资源所有者凭据授权(用户,密码),Brock Allen通常在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 identity是一个用户存储库,适用于资源所有者凭证工作流程。

1
我赞同使用Identity Server 4 - 我们使用它来为多个域提供单个身份验证提供程序。 - Geoff James

5

1

1

我找不到任何关于这个的好文档,但是我必须实现同样的功能,所以我通过修改标准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://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity 祝好运。

-2

1
欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户知道它是什么以及为什么存在,然后引用您链接的页面中最相关的部分,以防目标页面不可用。仅仅是一个链接的答案可能会被删除。 - g00glen00b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接