- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用单个 asp.net(4.6.1) web 项目,显然我无法验证在同一服务器上生成的 jwt token 。
Startup.cs:
var secret = Encoding.UTF8.GetBytes("12341234123412341234");
var jwtFormatter = new CustomJwtFormat("Any", "local", secret);
// This part checks the tokens
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ExternalBearer,
AuthenticationMode = AuthenticationMode.Active, // Block requests
AllowedAudiences = new []{"Any"},
TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey = new InMemorySymmetricSecurityKey(secret),
ValidAudience = "Any",
ValidIssuer = "local"
}
});
// This part issues tokens
app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = false,
TokenEndpointPath = new PathString("/auth"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
Provider = new CustomOAuthProvider(),
AccessTokenFormat = jwtFormatter,
RefreshTokenFormat = jwtFormatter
});
app.UseWebApi(config);
生成 token 的类看起来像
public class CustomJwtFormat : ISecureDataFormat<AuthenticationTicket>
{
private readonly string _allowedAudience;
private readonly string _issuer;
private readonly byte[] _jwtTokenSignKey;
public CustomJwtFormat(string allowedAudience, string issuer, byte[] jwtTokenSignKey)
{
_allowedAudience = allowedAudience;
_issuer = issuer;
_jwtTokenSignKey = jwtTokenSignKey;
}
public string Protect(AuthenticationTicket data)
{
if (data == null) throw new ArgumentNullException(nameof(data));
var signingCredentials = new SigningCredentials
(
new InMemorySymmetricSecurityKey(_jwtTokenSignKey),
"http://www.w3.org/2001/04/xmldsig-more#hmac-sha256",
"http://www.w3.org/2001/04/xmlenc#sha256"
);
return new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken(
_issuer,
_allowedAudience,
data.Identity.Claims,
DateTime.UtcNow, DateTime.UtcNow.AddMinutes(10),
signingCredentials
));
}
public AuthenticationTicket Unprotect(string protectedText)
{
throw new NotImplementedException();
}
}
我从 /auth
收到的 token 看起来有效,并通过了 jwt.io
上的调试器(没有标记 base64 用于签名)
但是 UseJwtBearerAuthentication
拒绝验证 token 。
这可能是什么原因?
此外,我已经尝试在没有 [Authorize]
的 Controller 中手动验证相同的 token ,它会完美地验证:
var t = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpc3MiOiJsb2NhbCIsImF1ZCI6IkFueSIsImV4cCI6MTQ3MjkxMDcwMSwibmJmIjoxNDcyOTEwMTAxfQ.ipSrRSGmje7wfzERsd-M1IDFJnN99AIC4Hs7YX4FIeI";
var TokenHandler = new JwtSecurityTokenHandler();;
var key = Encoding.UTF8.GetBytes("12341234123412341234");
SecurityToken validatedToken;
TokenValidationParameters paras = new TokenValidationParameters()
{
IssuerSigningKey = new InMemorySymmetricSecurityKey(key),
ValidAudience = "Any",
ValidIssuer = "local"
};
TokenHandler.ValidateToken(t, paras, out validatedToken);
欧文 3.0.1.0System.IdentityModel.Tokens.Jwt 4.0.3.308261200
最佳答案
问题不在于 token 验证,而是声明未传递到 [Authorize]
属性正在读取的 Thread.CurrentPrincipal
.
在 webapi 配置中:
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(DefaultAuthenticationTypes.ExternalBearer));
在启动配置中:
app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
AuthenticationType = DefaultAuthenticationTypes.ExternalBearer,
...
});
app.UseJwtBearerAuthentication1(new JwtBearerAuthenticationOptions()
{
AuthenticationType = DefaultAuthenticationTypes.ExternalBearer,
..
});
在 OAuthAuthorizationServerProvider 的 GrantResourceOwnerCredentials
中:
使用相同的身份验证类型,您可以从 context.Options
var identity = new ClaimsIdentity(youClaimsList, context.Options.AuthenticationType);
context.Validated(identity);
并确保所有四个 位置都与AuthenticationType 具有相同的字符串。如果 HostAuthenticationFilter
将不同的 authenticationType
作为输入,它不会将声明从 owin 传递到 webapi。
关于c# - 无法验证 UseJwtBearerAuthentication 中的 token 。授权被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39307640/
当您使用 VS 2017 创建新的 Web API 并选择使用“工作或学校帐户”进行身份验证时,您将获得使用 JwtBearerAuthentication 库的代码。也可以手动编写 Web API
我在我的应用程序堆栈中使用 Firebase 和 dotnet 核心。 我正在使用 Firebase iOS API 生成 JWT 罚款,并且可以使用 jwt.io 确认结构符合预期且有效。的解析器。
我正在尝试使用 JWT用于身份验证机制 ASP.NET Core Web API项目。假设这个项目没有 MVC部分并且不使用 cookie 身份验证。我已经基于 this guide 创建了我的代码.
有人可以解释一下 UseOAuthBearerAuthentication 和 UseJwtBearerAuthentication 之间有什么区别吗? 为什么我应该使用“UseOAuthBearer
使用单个 asp.net(4.6.1) web 项目,显然我无法验证在同一服务器上生成的 jwt token 。 Startup.cs: var secret = Encoding.U
将代码库从 ASP 5 beta 7 更新到 RC1-final 后,我开始从 JwtBearer 中间件收到此异常 Unable to cast object of type 'Newtonsoft
我正在像这样使用 UseJwtBearerAuthentication app.UseJwtBearerAuthentication(options => { options.Authority
使用 ASP.NET Core 1.0 (rtm),有点 minimal verifiable sample我已经生成,我看到我生成的 JSON Web token 没有通过 .net core js
我已经使用 dot net core 1.1 开发了一个 web 应用程序。在我更新到 asp 核心 2.0 之前,它一直工作正常。然后在尝试使用该应用程序时,它报告此错误: InvalidOpera
当 401 和 403 发生时,我想使用 JSON 响应模型进行响应。例如: HTTP 401 { "message": "Authentication failed. The request m
我见过表明 IApplicationBuilder 的示例有一个扩展方法.UseJwtBearerAuthentication(Action options) . 这个SO question和 Asp
我是一名优秀的程序员,十分优秀!