使用 ASP.NET core MVC/Razor 站点和 WebAPI 进行授权

Pet*_*ter 6 c# asp.net-mvc asp.net-core asp.net-core-webapi

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

Kev*_*vin 3

两者都处理身份验证/授权对我来说没有意义。

为什么同时使用 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 返回的状态代码做出反应

可能的实施

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

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

这是授权文档

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