自定义身份验证 asp.net 核心网站 api
Custom authentication asp.net core web api
我想使用密钥(api 密钥)授权 asp.net 核心网站 api。密钥将在授权 header 中传递,如下所示,
ex. Authorization keytype;h43484344343bbhfdjfdfhj34343
我想编写一个中间件来从请求 header 中读取此密钥并调用内部 api 来验证密钥。
在网络中 api 我们可以编写一个消息处理程序来执行此操作,但我是 asp.net 核心的新手。我看到了很多示例,但它们使用的是内置的 JWT 令牌身份验证。但我想使用我自己的密钥并解密此密钥并根据数据库条目进行验证。
任何人都可以就如何执行此操作提供一些代码示例吗?
我在使用 asp core 1.1 的解决方案中使用了这种方法。首先定义一个自定义方案:
public static class Authentication
{
public const string Scheme = "Custom";
}
然后你必须继承AuthenticationHandler<TOptions>
。这是验证 header 值的逻辑所在:
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
,您必须创建一个选项 class,在其中将 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
class 你终于可以添加你的中间件了:
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 ...
}
步骤很多,但希望这能帮助您前进!
我想使用密钥(api 密钥)授权 asp.net 核心网站 api。密钥将在授权 header 中传递,如下所示,
ex. Authorization keytype;h43484344343bbhfdjfdfhj34343
我想编写一个中间件来从请求 header 中读取此密钥并调用内部 api 来验证密钥。
在网络中 api 我们可以编写一个消息处理程序来执行此操作,但我是 asp.net 核心的新手。我看到了很多示例,但它们使用的是内置的 JWT 令牌身份验证。但我想使用我自己的密钥并解密此密钥并根据数据库条目进行验证。
任何人都可以就如何执行此操作提供一些代码示例吗?
我在使用 asp core 1.1 的解决方案中使用了这种方法。首先定义一个自定义方案:
public static class Authentication
{
public const string Scheme = "Custom";
}
然后你必须继承AuthenticationHandler<TOptions>
。这是验证 header 值的逻辑所在:
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
,您必须创建一个选项 class,在其中将 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
class 你终于可以添加你的中间件了:
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 ...
}
步骤很多,但希望这能帮助您前进!