好的,我在生成 JWT 时向有效负载添加了几个自定义声明,我可以在我的前端 (javascript) 中将它们拉出来就好了。然后我让我的 javascript 向一个微服务发送一个 ajax 调用,它连同它一起传递 JWT。我想从微服务中的 JWT 中获取我的自定义声明。我正在做以下事情:
Claims claims = Jwts.parser().setSigningKey(Vars.SECRET_KEY).parseClaimsJws(token).getBody();
User user = claims.get("customuser", User.class);
Run Code Online (Sandbox Code Playgroud)
它抛出一个异常。
io.jsonwebtoken.RequiredTypeException: Expected value to be of type: class net.netdatacorp.netdauth.model.User, but was class java.util.LinkedHashMap
at io.jsonwebtoken.impl.DefaultClaims.get(DefaultClaims.java:128)
Run Code Online (Sandbox Code Playgroud)
以下是我的自定义声明在前端 JWT 检查器中的数据显示方式。
{
jti: "83bffbad-7d36-4370-9332-21a84f2a3dce",
iat: 1498241526,
sub: "test",
iss: "www.test.net",
customuser: {
userId: 1,
userCd: "TMM",
firstNm: "Testy",
lastNm: "McTesty",
userNm: "test",
emailAddress: "jacob@test.net",
active: true,
createdDt: 1491355712000,
createdByUserId: 0,
lastUpdateDt: 1498199278000,
lastUpdateByUserId: 0,
lastLoginDt: 1484928016000
}
}
Run Code Online (Sandbox Code Playgroud)
我缺少什么才能拉出我的自定义声明?
我正在使用ASP.NET MVC 5和Identity 2与Entity Framework 6的系统.当用户登录时,我向该登录会话添加一些声明.我不想使用索赔表.
对于我的一个主张,我确实喜欢这样:
public class User : IdentityUser<int, UserLogin, UserRole, UserClaim>
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User, int> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
//We add the display name so that the _LoginPartial can pick it up;
userIdentity.AddClaim(new Claim("DisplayName", FirstName + " " + LastName));
// Add custom user claims here
return userIdentity;
}
public virtual ICollection<UserInsurance> UserInsurances { get; set; }
public User() …
Run Code Online (Sandbox Code Playgroud) asp.net-mvc login claims asp.net-identity asp.net-identity-2
使用 azure AzureADB2C 进行身份验证时,我想将门户中管理的自定义声明添加到声明原则
current code in start up
services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
.AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));
Run Code Online (Sandbox Code Playgroud)
我认为它应该像这样工作,但在令牌验证时从未被击中
services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
.AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options))
.AddJwtBearer(o =>
{
o.Events = new JwtBearerEvents
{
OnTokenValidated = async ctx =>
{
var claims = new List<Claim> { new Claim("ConfidentialAccess", "true") };
var appIdentity = new ClaimsIdentity(claims);
ctx.Principal.AddIdentity(appIdentity);
}
};
});
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Api 网关中设置 Ocelot,但我被困在授权上。我已经设法设置了声明,并且可以在我的控制器中使用它们进行授权。我向这样的用户添加声明:
await userManager.AddClaimAsync(user, new Claim(ClaimTypes.Role, configuration["InitialAdmin:Role"]));
Run Code Online (Sandbox Code Playgroud)
然后我使用以下配置设置 Ocelot:
{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/home/user",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5001
}
],
"UpstreamPathTemplate": "/api/home/user",
"RouteClaimsRequirement": {
"Role": "user"
}
},
{
"DownstreamPathTemplate": "/api/home/admin",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5001
}
],
"UpstreamPathTemplate": "/api/home/admin",
"RouteClaimsRequirement": {
"Role": "SuperAdmin"
}
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:5000"
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 ConfigureServices 方法:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines …
Run Code Online (Sandbox Code Playgroud) 我需要添加一个Claim
要传递给front-end
. 我想检查"IsSystemUser"
类型bool
,然后检查当然的值bool
,这样用户就无法看到系统设置。
我正在使用这个:
context.IssuedClaims.Add(new Claim("IsSystemUser", ));
Run Code Online (Sandbox Code Playgroud)
但是,我注意到它有字符串类型、字符串值和/或字符串值类型。
已经IntentUser
有一个字段isSystemUser
,我只是不知道如何向其添加声明。
context.IssuedClaims.Add(new Claim("IsSystemUser", user.IsSystemUser.ToString()));
Run Code Online (Sandbox Code Playgroud)
我应该这样做吗?
上面的文章很好地解释了如何通过注册映射到声明的策略来利用声明,并使用这些策略来控制对各种端点的访问。
然而,当涉及到定义声明或向身份添加声明时,本文提供的只是:
创建身份时,可能会为其分配由受信任方发出的一项或多项声明。
我们的声明可以通过 sql 查询访问,我想在身份验证后立即将用户声明嵌入到他们的 ClaimsPrincipal 中。
我见过通过中间件修改身份对象上的声明的示例。但是,中间件将在每个请求上执行,我不想从数据库中获取数据并修改每个请求的声明。我宁愿一开始就执行一次,并且能够利用本机授权 api 端点和 blazor 组件的属性。
我见过的其他示例涉及在 blazor 客户端项目上实现自定义 AccountClaimsPrincipalFactory。这确实为我提供了一种在 CreateUserAsync 中附加我自己的自定义声明的方法,该声明将在身份验证时调用一次。然而,当涉及到注入依赖项以允许我进行必要的 api 调用来获取声明时,我无法在不破坏应用程序的情况下实现我自己的构造函数。从我看到的其他帖子来看,除了依赖注入之外,从该方法中进行 http 调用似乎存在挑战。
任何人都可以向我指出在 .net core blazor 应用程序中添加一次且仅一次自定义声明的任何实现的方向吗?
我的理解是声明是基于WS-trust标准的STS事物,与SAML2标准无关.WS-trust STS令牌可以使用SAML以该格式发送声明.我对么?
claims-based-identity claims sts-securitytokenservice saml-2.0 ws-trust
我有一个使用ASP.NET Membership构建的webforms应用程序.我成功迁移到了身份.
我现在想要使用声明授权而不是Roles授权,但旧用户的角色信息已迁移到AspNetUserRoles
数据库中的表,但该AspNetUserClaims
表为空.迁移后注册的新用户,我可以AspNetUserClaims
使用以下代码添加:
IdentityResult result1 = manager.AddClaim(user.Id, new Claim(ClaimTypes.Role, "role"));
Run Code Online (Sandbox Code Playgroud)
但旧用户只在AspNetUserRoles
表中注册而不在AspNetUserClaims
表中.
在登录时,创建的声明是否也包括AspNetUserRoles
表格中的角色信息,还是仅包括表格中的角色信息AspNetUserClaims
?
请问User.IsInRole()
同时检查AspNetUserRoles
表和AspNetUserClaims
表?
如何将信息从AspNetUserRoles
表格迁移到AspNetUserClaims
表格?