asp.net - 使用 IdentityServer & Bearer 保护 ASP.NET API
问题描述
我有一个 3 层应用程序,其中有:
- Blazor Web 应用程序
- 一个 HTTP API
- 身份服务器
目前,我在 HTTP API 上有两种控制器:
- 通用 API:无需身份验证即可访问,但前提是调用来自 Web 应用程序
- 个人用途API:认证后才能访问
现在,“个人目的 API”工作正常。此 API 仅在用户登录时才可访问。
但是,我还需要保护“通用 API”免受任何黑客攻击,现在对“post/list”的调用会返回“未经授权的错误”!
我希望保护此 API,无需身份验证,但它必须只能从我的 Web 应用程序访问。
你知道我该怎么做吗?我的代码有什么问题或遗漏吗?
这是 HTTP API 端的控制器代码:
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class PostsController : ControllerBase
{
[HttpGet]
[Route("post/list")]
public async Task<List<Item>> GetListAsync()
{
...
}
}
这是我在 HTTP API 端的代码:
context.Services.AddAuthentication(Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = true;
options.ApiName = "SoCloze";
});
这是我在 Web 应用程序端的代码:
context.Services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.ExpireTimeSpan = TimeSpan.FromDays(ApplicationConstants.LoginCookieExpirationDelay);
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = true;
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.ClientId = configuration["AuthServer:ClientId"];
options.ClientSecret = configuration["AuthServer:ClientSecret"];
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("role");
options.Scope.Add("email");
options.Scope.Add("phone");
options.Scope.Add("SoCloze");
options.ClaimActions.MapAbpClaimTypes();
});
解决方案
你应该让你的控制器匿名。使用您的配置,只需从控制器中删除您的 Authorize 属性。如果您应用了全局策略,则需要将匿名属性添加到控制器:
[AllowAnonymous]
我不确定你想要实现什么,但我想你想要跨站点保护。也就是说,您希望限制某些端点只能从您的 blazor 应用程序的源访问。
您需要信任Same Origin Policy的客户端浏览器。同源策略控制两个不同源之间的交互。通常允许跨域写入,通常允许跨域嵌入,通常不允许跨域读取,但读取访问权限通常通过嵌入泄漏。
此保护仅适用于来自浏览器的 XHR 调用,它不保护直接访问(邮递员、提琴手、任何 http 客户端......)。
为了防止在您的帖子中进行跨域写入,您可以使用 Antiforgery 令牌。如果您在表单中指定 POST,则Asp Net Core会自动创建此令牌:
<form asp-controller="Todo" asp-action="Create" method="post">
...
</form>
或者
@using (Html.BeginForm("Create", "Todo"))
{
...
}
这将拒绝以前未从您的服务器加载的任何表单的任何帖子。
推荐阅读
- node.js - 使用 CTE 插入多个表不适合我
- javascript - 在 npm run android 之后,React Native Metro Server 没有启动
- laravel - DigitalOcean Spaces 不适用于 AWS 开发工具包 PHP
- snowflake-cloud-data-platform - 与 golang 驱动程序一起使用的雪花占位符格式
- javascript - 在 React 中为搜索同步事件处理程序
- django - Django 抛出 ConnectionAbortedError: [WinError 10053] 已建立的连接被主机中的软件中止
- javascript - SyntaxError: Unexpected token = in JSON at JSON.parse (
) - excel - 更正 VBA 运行时问题
- reactjs - $ yarn install 导致找不到模块 yarn-berry.js
- r - r Shiny中的fileInput函数没有响应