【发布时间】:2017-03-31 11:43:19
【问题描述】:
我想在 ASP.Net Core 中实现基于 JWT 的安全性。目前,我想做的就是读取Authorization 标头中的不记名令牌,并根据我的标准对其进行验证。我不需要(也不想)包含 ASP.Net Identity。事实上,除非我真的需要它们,否则我会尽可能多地避免使用 MVC 添加的东西。
我创建了一个最小的项目来演示这个问题。要查看原始代码,只需查看编辑历史记录。我期待这个示例拒绝所有对/api/icons 的请求,除非它们为Authorization HTTP 标头提供相应的不记名令牌。该示例实际上允许所有请求。
Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Routing;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using System;
using Newtonsoft.Json.Serialization;
namespace JWTSecurity
{
public class Startup
{
public IConfigurationRoot Configuration { get; set; }
public Startup(IHostingEnvironment env)
{
IConfigurationBuilder builder = new ConfigurationBuilder().SetBasePath(env.ContentRootPath);
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.AddAuthentication();
services.AddMvcCore().AddJsonFormatters(options => options.ContractResolver = new CamelCasePropertyNamesContractResolver());
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole();
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("supersecretkey")),
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
}
});
app.UseMvc(routes => routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"));
}
}
}
控制器/图标控制器.cs
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace JWTSecurity.Controllers
{
[Route("api/[controller]")]
public class IconsController : Controller
{
[Authorize]
public IActionResult Get()
{
return Ok("Some content");
}
}
}
【问题讨论】:
-
你能显示你应用了授权属性的方法和类吗?
-
您的 JWT 令牌中间件在哪里?您的服务正在通过 /token 端点或类似的东西正确生成 JWT?
-
此时,我不关心生成令牌,我只关心拒绝任何在标头中不提供令牌的内容。
-
你现在拥有的和我拥有的非常相似,除了我有 ValidateIssuer = true 和 ValidateAudience = true,但我认为这些不是必需的。我没有 services.AddAuthentication();要么。
-
是的,我只是尝试添加它们,没有区别。一定有我想念的东西...
标签: c# asp.net-core asp.net-core-webapi