asp.net-web-api – 自定义身份验证asp.net核心web api

前端之家收集整理的这篇文章主要介绍了asp.net-web-api – 自定义身份验证asp.net核心web api前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用一个秘密密钥(api密钥)授权asp.net核心web api.密钥将在Authorization标头中传递,如下所示,
  1. ex. Authorization keytype;h43484344343bbhfdjfdfhj34343

我想编写一个中间件来从请求头读取此密钥,并调用内部api来验证密钥.

在web api中,我们可以编写一个消息处理程序来执行此操作,但我是asp.net核心的新手.我看到了很多样本​​,但他们正在使用内置的JWT令牌认证.但是我想使用自己的密钥并解密此密钥并对数据库条目进行验证.

任何人都可以建议一些代码示例如何做到这一点?

解决方法

我在使用asp核心1.1的解决方案中使用了这种方法.首先定义一个自定义方案:
  1. public static class Authentication
  2. {
  3. public const string Scheme = "Custom";
  4. }

然后,您必须继承AuthenticationHandler< TOptions>.以下是验证标头值的逻辑:

  1. public class MyAuthenticationHandler : AuthenticationHandler<MyOptions>
  2. {
  3. protected override Task<AuthenticateResult> HandleAuthenticateAsync()
  4. {
  5. var authorizationHeader = Context.Request.Headers["Authorization"];
  6. if (!authorizationHeader.Any())
  7. return Task.FromResult(AuthenticateResult.Skip());
  8.  
  9. var value = authorizationHeader.ToString();
  10. if (string.IsNullOrWhiteSpace(value))
  11. return Task.FromResult(AuthenticateResult.Skip());
  12.  
  13. // place logic here to validate the header value (decrypt,call db etc)
  14.  
  15. var claims = new[]
  16. {
  17. new Claim(System.Security.Claims.ClaimTypes.Name,"Bob")
  18. };
  19.  
  20. // create a new claims identity and return an AuthenticationTicket
  21. // with the correct scheme
  22. var claimsIdentity = new ClaimsIdentity(claims,Authentication.Scheme);
  23.  
  24. var ticket = new AuthenticationTicket(new ClaimsPrincipal(claimsIdentity),new AuthenticationProperties(),Authentication.Scheme);
  25.  
  26. return Task.FromResult(AuthenticateResult.Success(ticket));
  27. }
  28. }

为了继承AuthenticationHandler,您必须创建一个选项类,在其中将AuthenticationScheme属性设置为您正在使用的方案:

  1. public class MyOptions : AuthenticationOptions
  2. {
  3. AuthenticationScheme = Authentication.Scheme;
  4. }

在此之后,您必须继承AuthenticationMiddleware< TOptions>.这将创建您在上一步中实现的处理程序:

  1. public class MyAuthenticationMiddleware : AuthenticationMiddleware<MyOptions>
  2. {
  3. public MyAuthenticationMiddleware(RequestDelegate next,IOptions<MyOptions> options,ILoggerFactory loggerFactory,UrlEncoder encoder) : base(next,options,loggerFactory,encoder)
  4. {
  5. }
  6.  
  7. protected override AuthenticationHandler<MyOptions> CreateHandler()
  8. {
  9. return new MyAuthenticationHandler();
  10. }
  11. }

为了轻松插入中间件,您可以定义以下扩展方法

  1. public static IApplicationBuilder UseMyAuthentication(this IApplicationBuilder app,IConfigurationSection config)
  2. {
  3. return app.UseMyAuthentication(options => {});
  4. }
  5.  
  6. private static IApplicationBuilder UseMyAuthentication(this IApplicationBuilder app,Action<MyOptions> configure)
  7. {
  8. var options = new MyOptions();
  9. configure?.Invoke(options);
  10.  
  11. return app.UseMiddleware<MyAuthenticationMiddleware>(new OptionsWrapper<MyOptions>(options));
  12. }

然后在您的Startup类中,您最终可以添加您的中间件:

  1. public void Configure(IApplicationBuilder app,IHostingEnvironment env)
  2. {
  3. app.UseMyAuthentication(Configuration.GetSection("MyAuthenticationOptions"));
  4.  
  5. // other stuff
  6.  
  7. app.UseMvc();
  8. }

然后在指定刚刚创建的方案的操作上添加AuthorizeAttribute:

  1. [Authorize(ActiveAuthenticationSchemes = Authentication.Scheme)]
  2. public IActionResult Get()
  3. {
  4. // stuff ...
  5. }

有很多步骤,但希望这会让你前进!

猜你在找的asp.Net相关文章