asp.net-web-api – 自定义身份验证asp.net核心web api
|
我想使用一个秘密密钥(api密钥)授权asp.net核心web api.密钥将在Authorization标头中传递,如下所示, ex. Authorization keytype;h43484344343bbhfdjfdfhj34343 我想编写一个中间件来从请求头读取此密钥,并调用内部api来验证密钥. 在web api中,我们可以编写一个消息处理程序来执行此操作,但我是asp.net核心的新手.我看到了很多样本,但他们正在使用内置的JWT令牌认证.但是我想使用自己的密钥并解密此密钥并对数据库条目进行验证. 任何人都可以建议一些代码示例如何做到这一点? 解决方法我在使用asp核心1.1的解决方案中使用了这种方法.首先定义一个自定义方案:public static class Authentication
{
public const string Scheme = "Custom";
}
然后,您必须继承AuthenticationHandler< TOptions>.以下是验证标头值的逻辑: public class MyAuthenticationHandler : AuthenticationHandler<MyOptions>
{
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
var authorizationHeader = Context.Request.Headers["Authorization"];
if (!authorizationHeader.Any())
return Task.FromResult(AuthenticateResult.Skip());
var value = authorizationHeader.ToString();
if (string.IsNullOrWhiteSpace(value))
return Task.FromResult(AuthenticateResult.Skip());
// place logic here to validate the header value (decrypt,call db etc)
var claims = new[]
{
new Claim(System.Security.Claims.ClaimTypes.Name,"Bob")
};
// create a new claims identity and return an AuthenticationTicket
// with the correct scheme
var claimsIdentity = new ClaimsIdentity(claims,Authentication.Scheme);
var ticket = new AuthenticationTicket(new ClaimsPrincipal(claimsIdentity),new AuthenticationProperties(),Authentication.Scheme);
return Task.FromResult(AuthenticateResult.Success(ticket));
}
}
为了继承AuthenticationHandler,您必须创建一个选项类,在其中将AuthenticationScheme属性设置为您正在使用的方案: public class MyOptions : AuthenticationOptions
{
AuthenticationScheme = Authentication.Scheme;
}
在此之后,您必须继承AuthenticationMiddleware< TOptions>.这将创建您在上一步中实现的处理程序: public class MyAuthenticationMiddleware : AuthenticationMiddleware<MyOptions>
{
public MyAuthenticationMiddleware(RequestDelegate next,IOptions<MyOptions> options,ILoggerFactory loggerFactory,UrlEncoder encoder) : base(next,options,loggerFactory,encoder)
{
}
protected override AuthenticationHandler<MyOptions> CreateHandler()
{
return new MyAuthenticationHandler();
}
}
为了轻松插入中间件,您可以定义以下扩展方法: public static IApplicationBuilder UseMyAuthentication(this IApplicationBuilder app,IConfigurationSection config)
{
return app.UseMyAuthentication(options => {});
}
private static IApplicationBuilder UseMyAuthentication(this IApplicationBuilder app,Action<MyOptions> configure)
{
var options = new MyOptions();
configure?.Invoke(options);
return app.UseMiddleware<MyAuthenticationMiddleware>(new OptionsWrapper<MyOptions>(options));
}
然后在您的Startup类中,您最终可以添加您的中间件: public void Configure(IApplicationBuilder app,IHostingEnvironment env)
{
app.UseMyAuthentication(Configuration.GetSection("MyAuthenticationOptions"));
// other stuff
app.UseMvc();
}
然后在指定刚刚创建的方案的操作上添加AuthorizeAttribute: [Authorize(ActiveAuthenticationSchemes = Authentication.Scheme)]
public IActionResult Get()
{
// stuff ...
}
有很多步骤,但希望这会让你前进! (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET MVC:什么时候设置Thread.CurrentThread.CurrentUI
- 为什么32位应用程序池在IIS中更有效?
- asp.net-mvc – Web API模型绑定器不能与HttpPostedFileBas
- asp.net – IIS配置错误 – 此配置部分不能用于此路径
- asp.net – 如何在MVC4的部分视图中添加脚本?
- asp.net – IIS 7的最大默认POST请求大小 – 如何增加64kB
- asp.net-web-api – OWIN中间件中的全局异常处理
- asp.net-mvc-3 – MVC3 AllowHtml属性的问题
- asp.net-mvc – ASP MVC 5项目’New Scaffolded Item …’在
- powershell – 如何检查asp.net mvc 3是否已安装?
- asp-classic – 经典的ASP gremlims,每当使用HTM
- asp.net – Facebox为输入添加逗号
- asp.net – UserHostAddress提供错误的IP
- asp.net-mvc – View中的意外NullReferenceExcep
- asp.net – 使用EF4代码优先:如何在不丢失数据的
- asp.net-mvc – 保护ASP.Net MVC站点
- asp.net-mvc – 在服务器上安装ASP.NET MVC 4
- 如何在ASP.NET页面上注册自定义服务器控件
- asp.net-mvc – 在实体框架代码中为同一表定义多
- asp.net-core – CoreCLR中的哈希算法
