根据 ASP.NET Core 请求标头中提供的 API 密钥授权用户

     2023-03-10     164

关键词:

【中文标题】根据 ASP.NET Core 请求标头中提供的 API 密钥授权用户【英文标题】:Authorize user based on API-key supplied in request header in ASP.NET Core 【发布时间】:2017-06-23 12:25:30 【问题描述】:

我正在尝试在 ASP.NET Core 中重写我目前对 ASP.NET 4.6 的一些授权。

我知道授权发生了一些变化,我发现很难在 ASP.NET Core 中实现我非常简单的身份验证策略。

我的要求:

对服务器的每个请求都应包含一个名为“key”的标头。根据该键的值,我将能够查询数据库并检查该键是代表普通用户还是管理员用户。如果请求不包含有效的密钥,则该请求未被授权。

如何在 ASP.NET Core 中实现这一点?我发现的每个示例似乎都完全超出了我的需求。

在 ASP.NET 4.6 中,我使用自己的自定义 AuthorizeAttributes 在控制器上使用,例如

[User]
public IHttpActionResult DoSomethingOnlyUsersCanDo() 

[Admin]
public IHttpActionResult DoSomethingOnlyAdminsCanDo() 

我可以在 ASP.NET Core 中做同样的事情吗?

【问题讨论】:

【参考方案1】:

在 ASP.NET Core 中,建议您不要从 AuthorizeAttribute 继承。相反,您可以制定自定义授权策略:https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims。

您将需要一个身份验证处理程序,该处理程序根据标头为用户创建一个 ClaimsIdentity。然后,您可以制定政策来断言用户存在某些声明。

您可以在此处找到基本身份验证的实现:https://github.com/blowdart/idunno.Authentication。 当然请注意 Barry 的评论:

它旨在演示如何编写身份验证中间件,而不是您会认真考虑使用的东西。

它的核心在BasicAuthenticationHandler,继承自AuthenticationHandler<BasicAuthenticationOptions>

此实现中的主体是在开发人员制作的事件回调中创建的,在示例中为here:

if (context.Username == context.Password)

    var claims = new[]
    
        new Claim(ClaimTypes.NameIdentifier, context.Username, ClaimValueTypes.String, context.Options.ClaimsIssuer),
        new Claim(ClaimTypes.Name, context.Username, ClaimValueTypes.String, context.Options.ClaimsIssuer)
    ;

    context.Principal = new ClaimsPrincipal(new ClaimsIdentity(claims, context.Scheme.Name));
    context.Success();

然后根据主体调用此回调后,在处理程序中创建身份验证票:

var ticket = new AuthenticationTicket(validateCredentialsContext.Principal, Scheme.Name);
return AuthenticateResult.Success(ticket);

我还写了一篇关于实现自定义身份验证方案的文章:Creating an authentication scheme in ASP.NET Core 2.0。

【讨论】:

ASP.Net Core 2.0 如何获取中间件中的所有请求标头? [复制]

】ASP.NetCore2.0如何获取中间件中的所有请求标头?[复制]【英文标题】:ASP.NetCore2.0Howtogetallrequestheadersinmiddleware?[duplicate]【发布时间】:2018-08-2418:06:34【问题描述】:在ASP.NetCore2.0中,我尝试在自定义中间件中验证传入的请求标头... 查看详情

如何使用 asp.net core api 在其标头中授权带有 x-auth-token 的请求?

】如何使用asp.netcoreapi在其标头中授权带有x-auth-token的请求?【英文标题】:Howtoauthorizerequestswithx-auth-tokeninitsheaderusingasp.netcoreapi?【发布时间】:2019-11-1714:33:01【问题描述】:我使用asp.netcorewebapi生成了包含用户信息和她的角色... 查看详情

使用 ASP.NET Core 在 POST 请求的标头中包含身份验证

】使用ASP.NETCore在POST请求的标头中包含身份验证【英文标题】:IncludingAuthenticationintheHeaderofaPOSTRequestusingASP.NETCore【发布时间】:2021-12-1108:15:30【问题描述】:我正在尝试请求接收会话ID以与支付网关集成。varm=System.Text.Encoding.Unic... 查看详情

从 ASP.NET Core 中的不同 HTTP 标头读取 JWT 令牌

...头的标头中的另一个JWTBearer令牌。例如,假设发送一个GET请求以将产品发送到/api/products,并在名为 查看详情

基于 asp.net core cliam 的授权抛出“HTTP 错误 400。请求标头的大小太长。”当设置大量索赔时

】基于asp.netcorecliam的授权抛出“HTTP错误400。请求标头的大小太长。”当设置大量索赔时【英文标题】:asp.netcorecliambasedauthorizationthrow"HTTPError400.Thesizeoftherequestheadersistoolong."whenlargenumberofclaimisset【发布时间】:2021-07-2416:48... 查看详情

ASP.Net Core WebAPI - 请求的资源上不存在“Access-Control-Allow-Origin”标头

】ASP.NetCoreWebAPI-请求的资源上不存在“Access-Control-Allow-Origin”标头【英文标题】:ASP.NetCoreWebAPI-No\'Access-Control-Allow-Origin\'headerispresentontherequestedresource【发布时间】:2017-09-2800:29:32【问题描述】:我在使用IAsyncResourceFilter实现时遇... 查看详情

在 ASP.NET Core 的中间件中注入服务

...P.NETCore【发布时间】:2016-11-0513:57:05【问题描述】:我想根据HTTP标头值注入服务。所以我有2个类-DbDataProvider和InMemDataProvider,它们都是从IDataProvider实现的。每当进行API调用时,客户端都会传递一个标头,以确定是需要DbDataProv 查看详情

ASP.Net Core API 中的请求验证

...nASP.NetCoreAPI【发布时间】:2019-08-0307:24:25【问题描述】:根据这个question,dotnetcore中不存在RequestValidation。如果我正确理解了这个问题,我需要实现一个自定义方法来验证所有预期模型中的每个字符串。在我的例子中,我正在研... 查看详情

React + ASP.Net Core 3:CORS 对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头

】React+ASP.NetCore3:CORS对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头【英文标题】:React+ASP.NetCore3:CORSResponsetopreflightrequestdoesn\'tpassaccesscontrolcheck:No\'Access-Control-Allow-Origin\'header【发布时间】:2020-05-0509 查看详情

ASP.NET Core 请求本地化选项

】ASP.NETCore请求本地化选项【英文标题】:ASP.NETCoreRequestLocalizationOptions【发布时间】:2016-12-2416:55:27【问题描述】:这是我的自定义请求文化提供程序,如果url中没有指定文化(例如http://sypalo.com/ru或http://sypalo.com/en),它将返... 查看详情

每个请求的 ASP.NET Core API JSON 序列化程序设置

】每个请求的ASP.NETCoreAPIJSON序列化程序设置【英文标题】:ASP.NETCoreAPIJSONserializersettingsperrequest【发布时间】:2017-12-0308:12:28【问题描述】:基于请求中的某些值(标头或url),我想更改我的DTO对象的序列化。为什么?好吧,我... 查看详情

Asp.net Core、JWT 和 CORS 标头

】Asp.netCore、JWT和CORS标头【英文标题】:Asp.netCore,JWT,andCORSHeaders【发布时间】:2016-05-0211:24:00【问题描述】:当我在同一服务上同时启用JWT承载身份验证和CORS时,我在从服务器获取适当的Access-Control-Allow-Origin标头时遇到问题。... 查看详情

放置请求期间的 ASP Net Core CORS 错误

】放置请求期间的ASPNetCoreCORS错误【英文标题】:ASPNetCoreCORSerrorduringputrequest【发布时间】:2019-03-1005:50:49【问题描述】:我目前正在开发一个ASPNetCoreAPI,当我尝试向服务器发送PUT请求时,我收到了返回错误:对预检请求的响应... 查看详情

为 ASP.NET Core MVC 中的所有响应添加标头

】为ASP.NETCoreMVC中的所有响应添加标头【英文标题】:AddaheadertoallresponsesinASP.NETCoreMVC【发布时间】:2015-06-1217:50:32【问题描述】:我想知道如何将Access-Control-Allow-Origin:*添加到我的标题中。我试过这个没有成功:app.Use((context,next)... 查看详情

Asp.Net Core 中基于请求的 Razor 页面本地化

...务器托管。我住在英国。当我在本地打开页面时,我可以根据我居住的地方看到日期dd/mm/yyyy的正确格式,但是,当我将应用程序部署到Azure美国应用程序服务并在同一个Web浏览器 查看详情

在 ASP.NET Core 控制器中模拟 HttpRequest

...了一个接口,我可以轻松地模拟它。但是控制器必须检查请求中的标头以获得令牌,当我自己简单地实例化控制器时,该请求似乎不存在,而且它也是 查看详情

如果我的标头中根本没有 Content-Type,ASP.NET Core Web API 管道的流程是啥?

】如果我的标头中根本没有Content-Type,ASP.NETCoreWebAPI管道的流程是啥?【英文标题】:WhatistheflowofASP.NETCoreWebAPIpipelineifIdonothaveContent-Typeatallinmyheader?如果我的标头中根本没有Content-Type,ASP.NETCoreWebAPI管道的流程是什么?【发布时间... 查看详情

ASP.Net Core 2.0:无需请求即可创建 UrlHelper

】ASP.NetCore2.0:无需请求即可创建UrlHelper【英文标题】:ASP.NetCore2.0:CreatingUrlHelperwithoutrequest【发布时间】:2017-09-0712:14:34【问题描述】:我正在为后台工作人员创建一个UrlHelper以创建回调url,这意味着它不是正常请求的一部分,... 查看详情