Asp.Net 核心 2 验证不记名令牌
Asp.Net Core 2 Validating bearer token
我正在努力寻找一种确切的方法来验证我的 OAuth
bearer
令牌,当请求发送到 API 我正在处理的是 Asp.Net core
项目。
此处的目的是提取不记名令牌并Validate
它,如果一切正常,则继续请求。
到目前为止,我的发现有以下几点
JWT bear token 授权主要讲access_token
Asp.Net 核心安全中间件
处理此问题的自定义授权属性。
我不太确定如何实现验证?我应该提取不记名令牌然后创建自定义验证方法吗?
理想情况下希望 [Authorize]
属性能够处理此问题。
有什么建议吗?
好吧,经过更多的研究,我终于发现自定义 AuthorizationHandler
是一个更合适的解决方案,因为假设使用自定义 Authorize
属性,Asp.Net 核心中没有建议。
设置很简单,我可以从 header 中提取我的 Bearer
令牌,以便使用 OAuth
进一步授权。
这是我的方法:
public class CustomAuthorizationHandler: IAuthorizationHandler
{
public Task HandleAsync(AuthorizationHandlerContext context)
{
var authFilterCtx = (Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
string authHeader = authFilterCtx.HttpContext.Request.Headers["Authorization"];
if (authHeader != null && authHeader.Contains("Bearer"))
{
var token = authHeader.Replace("Bearer", "");
// Now token can be used for further authorization
}
throw new NotImplementedException();
}
}
最后在 Startup.cs
中注册处理程序
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IAuthorizationHandler, CustomAuthorizationHandler>();
}
我认为将以下代码片段放入 ConfigureServices() 应该能够在安装 Microsoft.AspNetCore.Authentication.JwtBearer 后验证您的 access_token NuGet 包:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
//options.SaveToken = true;
options.MetadataAddress = ValidationEndPoint;
options.RequireHttpsMetadata = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
ValidateLifetime = true,
ValidateIssuer = true,
ValidateAudience = true,
ValidIssuer = tokenIssuer,
ValidAudiences = new[] { clientId },
ValidAudience = null
};
});
services.AddAuthorization(options =>
{
options.AddPolicy("MyPolicy", policy =>
{
policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
policy.RequireAuthenticatedUser();
});
});
记得把app.UseAuthentication()和app.UseAuthorization()放在Configure()方法中。并将 [授权] 添加到您的控制器 API.
我正在努力寻找一种确切的方法来验证我的 OAuth
bearer
令牌,当请求发送到 API 我正在处理的是 Asp.Net core
项目。
此处的目的是提取不记名令牌并Validate
它,如果一切正常,则继续请求。
到目前为止,我的发现有以下几点
JWT bear token 授权主要讲
access_token
Asp.Net 核心安全中间件
处理此问题的自定义授权属性。
我不太确定如何实现验证?我应该提取不记名令牌然后创建自定义验证方法吗?
理想情况下希望 [Authorize]
属性能够处理此问题。
有什么建议吗?
好吧,经过更多的研究,我终于发现自定义 AuthorizationHandler
是一个更合适的解决方案,因为假设使用自定义 Authorize
属性,Asp.Net 核心中没有建议。
设置很简单,我可以从 header 中提取我的 Bearer
令牌,以便使用 OAuth
进一步授权。
这是我的方法:
public class CustomAuthorizationHandler: IAuthorizationHandler
{
public Task HandleAsync(AuthorizationHandlerContext context)
{
var authFilterCtx = (Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
string authHeader = authFilterCtx.HttpContext.Request.Headers["Authorization"];
if (authHeader != null && authHeader.Contains("Bearer"))
{
var token = authHeader.Replace("Bearer", "");
// Now token can be used for further authorization
}
throw new NotImplementedException();
}
}
最后在 Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IAuthorizationHandler, CustomAuthorizationHandler>();
}
我认为将以下代码片段放入 ConfigureServices() 应该能够在安装 Microsoft.AspNetCore.Authentication.JwtBearer 后验证您的 access_token NuGet 包:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
//options.SaveToken = true;
options.MetadataAddress = ValidationEndPoint;
options.RequireHttpsMetadata = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
ValidateLifetime = true,
ValidateIssuer = true,
ValidateAudience = true,
ValidIssuer = tokenIssuer,
ValidAudiences = new[] { clientId },
ValidAudience = null
};
});
services.AddAuthorization(options =>
{
options.AddPolicy("MyPolicy", policy =>
{
policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
policy.RequireAuthenticatedUser();
});
});
记得把app.UseAuthentication()和app.UseAuthorization()放在Configure()方法中。并将 [授权] 添加到您的控制器 API.