c# - 使用 ASP.NET 核心 MVC/Razor 站点和 WebAPI 进行授权
问题描述
我已经在我的应用程序的 API 部分实现了 JWT 身份验证/授权。我还有一个 ASP.NET 核心 MVC 网站,我想通过它进行身份验证。是否可以使用 API 中的 JWT 令牌对网站进行身份验证?我想阻止用户去特定的位置,除非他们被授权,如果没有,则重定向到登录页面。我发现的所有示例都显示了如何使用 API (JWT) 或 MVC 网站 (cookies) 执行此操作,但不能同时使用两者。
解决方案
同时处理身份验证/授权对我来说没有意义。
为什么同时使用 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
}
}
这是授权文档
推荐阅读
- asp.net-mvc - linq to entity 无法识别该方法
- node.js - Laravel 编译“错误:找不到 PATH/node_modules/laravel-mix/..”
- javascript - Javascript 数组的自定义排序功能适用于 Chrome 控制台,但不适用于 React
- angular - 角度异步函数 OnInit
- python - 某些行值的有条件增加 - Pandas
- ecmascript-6 - ES6 Import 为对象提供未定义
- bash - 写入具有特定字体大小的文件
- c# - 创建订单时的 3pl api 中心不起作用
- java - 在线程之间划分大小
- python - 较短的代码是否有明显的性能优势?