【发布时间】:2020-01-25 09:19:11
【问题描述】:
我想做的是在我的 API 中提出可以通过 Windows 身份验证或 JWT 不记名身份验证访问的不同类型的端点。
在Startup.cs --> Configure中,身份验证配置如下,以允许使用所需参数进行承载身份验证:
// Add JWT Bearer
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(tokenManagement.Secret)),
ValidIssuer = tokenManagement.Issuer,
ValidateIssuer = true,
ValidateLifetime = true,
ValidateAudience = false,
ClockSkew = TimeSpan.FromSeconds(tokenManagement.ClockSkewSeconds)
};
});
为了保护我的端点,我尝试了这样的方法:
// THIS WAY I CAN LIMIT TO WINDOWS CREDENTIAL
[Authorize]
[HttpGet("[action]")]
public IActionResult AuthorizeWindowsUser()
{
var user = HttpContext.User;
if (user.GetType() == typeof(System.Security.Principal.WindowsPrincipal))
{
return Ok();
}
return Unauthorized();
}
// THIS WAY I CAN LIMIT TO JWT
[Authorize]
[HttpGet("[action]")]
public IActionResult AuthorizeLoginUser()
{
var user = HttpContext.User;
if (user.GetType() == typeof(System.Security.Claims.ClaimsPrincipal))
{
return Ok();
}
return Unauthorized();
}
它正在工作,但我的问题是:
- 这看起来合乎逻辑吗?我的目标是保护提供用户令牌的端点。一个端点将受到 JWT 令牌(刷新令牌)和特定角色的保护,一个端点将受到 Windows 凭据的保护。
- 我错过了什么吗?当我只使用 Windows 身份验证时,我曾经在我的 Startup.cs --> Configure 中设置 services.AddAuthentication(IISDefaults.AuthenticationScheme);似乎没有必要在上面描述的实现中工作,但我真的不知道这条线是做什么的以及是否有必要(顺便说一句,似乎没有)。
- 是否有更智能/更漂亮的方法来检查用户类型?可能类似于自定义属性
感谢您的建议!
【问题讨论】:
标签: authentication asp.net-core