【问题标题】:Authorize with both ASP.NET core MVC/Razor site AND a WebAPI使用 ASP.NET 核心 MVC/Razor 站点和 WebAPI 进行授权
【发布时间】:2020-06-11 07:41:14
【问题描述】:

我已经在我的应用程序的 API 部分实现了 JWT 身份验证/授权。我还有一个 ASP.NET 核心 MVC 网站,我想通过它进行身份验证。是否可以使用 API 中的 JWT 令牌对网站进行身份验证?我想阻止用户去特定的位置,除非他们被授权,如果没有,则重定向到登录页面。我发现的所有示例都显示了如何使用 API (JWT) 或 MVC 网站 (cookies) 执行此操作,但不能同时使用两者。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core asp.net-core-webapi


    【解决方案1】:

    同时处理身份验证/授权对我来说没有意义。

    为什么同时使用 MVC 应用和 Web API 进行身份验证没有意义

    如果您希望 API 和 MVC Web 应用程序都处理身份验证和授权,那么您的 MVC 应用程序和 API 都需要能够验证它收到的令牌并检查用户拥有的角色。这意味着您将需要复制您的身份验证 API 具有的所有身份验证/授权逻辑,这将使您的 API 变得多余,因为当您的 MVC 应用程序处理验证令牌时,使用 API 仅创建令牌没有多大意义。

    推荐:

    每当在您的 MVC Web 应用程序上调用受保护资源时,将令牌从您的 MVC 应用程序传递到您的身份验证 API,以验证用户是否有权访问此资源。如果您的身份验证 API 的响应是 401 或 403,请适当处理它们(重定向到登录)。如果响应为 200 OK,则显示资源。

    基本上,对于需要身份验证的每个请求,您都需要将 JWT 传递给身份验证 API,并且您的 MVC Web 应用会根据身份验证 API 返回的状态代码做出反应

    可能的实施

    自定义身份验证处理程序可能是处理此问题的好地方。你可以通过覆盖AuthenticationHandler中的HandleAuthenticateAsync方法来做到这一点

    然后在启动时注册您的自定义身份验证和授权类。这是它的外观的快速示例。

    public class MyCustomAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
    {
        public PlatformAuthenticationHandler(
            IOptionsMonitor<AuthenticationSchemeOptions> options, 
            ILoggerFactory logger, 
            UrlEncoder encoder,
            ISystemClock clock) 
            : base(options, logger, encoder, clock)
        {
        }
    
        protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
        {
            //Send your request to your API and return either 
            //AuthenticateResult.Fail
            //return AuthenticateResult.Success
        }
    }
    

    这是授权文档

    https://docs.microsoft.com/en-us/aspnet/core/security/authorization/iauthorizationpolicyprovider?view=aspnetcore-3.1

    【讨论】:

    • 感谢您的回答。我想我来自 aspx 背景,在那里你有内置的身份验证/重定向登录等。但我确实想要一个用于应用程序的 API 设置,并且想知道是否可以进行某种共享身份验证。所以我想我会做一些手动的客户端工作。再次感谢。
    • 我更新了我的答案以提供有关可能实施的更多信息。它可能对你有帮助。我刚刚从stackoverflow.com/questions/58363002/… 的问题中提取了 sn-p,因为我现在没有自己的样品可以寄给你
    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2017-07-18
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多