OAuth 2.0 和 Open Id Connect 声明问题
OAuth 2.0 and Open Id Connect claims issue
我正在学习 OAuth 2.0
和 Open Id Connect
,现在我遇到了一个问题:id_token
:
中没有提出声明
我已经创建了 InMemoryUser
并为他声明:
return new List<InMemoryUser>()
{
new InMemoryUser()
{
Username = "SomeName",
Password = "SomePassword",
Subject = "b05d3546-6ca8-4d32-b95c-77e94d705ddf",
Claims = new Claim[]
{
new Claim(IdentityServer3.Core.Constants.ClaimTypes.GivenName, "MyGivenName"),
new Claim(IdentityServer3.Core.Constants.ClaimTypes.FamilyName, "MyFamilyName"),
}
}
}
我的范围:
return new List<Scope>()
{
StandardScopes.OpenId,
StandardScopes.Profile,
new Scope()
{
Name = "somename",
DisplayName = "some display name",
Description = "some description",
Type = ScopeType.Resource
}
};
此外,我已经创建了 MVC 客户端和 Startup
class 并包含了配置文件 scope
:
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationType = "Cookies"
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
ClientId = "TripsHybrid",
Authority = Constants.Constants.TripsSts,
RedirectUri = Constants.Constants.TripsMvc,
SignInAsAuthenticationType = "Cookies",
ResponseType = "code id_token token",
Scope = "openid profile", // "profile" scope inсluded
}
}
但是当我获得 id_token
并对其进行解码时,没有我在创建 InMemoryUser
时设置的声明。此外,在将它们打印到 Debug
:
之后,User.Identity.Claims
中没有声明
if (this.User.Identity.IsAuthenticated)
{
Debug.WriteLine("Claims:");
var identity = this.User.Identity as ClaimsIdentity;
foreach (var claim in identity.Claims)
{
Debug.WriteLine(claim.Type + " - " + claim.Value);
}
}
请帮我找出原因并在id_token
中添加声明。谢谢
对我来说一切都很好,但有时由于 identityserver 和 aspNetIdentity 中的声明之间的差异,声明没有正确映射
尝试清除 MVC 应用中的默认声明映射 Startup.cs:
// Clear The InboundClaimTypeMap
JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();
终于找到问题的解决方法了。
问题出在 IdentityServer3
NuGet 包版本中。在教程中使用了包 IdentityServer3 2.0.1
,但我已经安装了包 IdentityServer3 2.5.0
.
我在获取范围时更改了我的代码:
public static IEnumerable<Scope> Get()
{
Scope profileScope = StandardScopes.Profile;
profileScope.IncludeAllClaimsForUser = true; // set this property to true
return new List<Scope>()
{
StandardScopes.OpenId,
profileScope,
new Scope()
{
Name = "somename",
DisplayName = "some display name",
Description = "some description",
Type = ScopeType.Resource
}
};
}
我已经设置了 IncludeAllClaimsForUser = true
,现在所有声明都出现在身份令牌 (id_token
) 中,我可以使用此代码(与之前相同)在我的 MVC 客户端中获取所有声明:
if (this.User.Identity.IsAuthenticated)
{
Debug.WriteLine("Claims:");
var identity = this.User.Identity as ClaimsIdentity;
foreach (var claim in identity.Claims)
{
Debug.WriteLine(claim.Type + " - " + claim.Value);
}
}
当我尝试使用旧包时,问题中的代码按预期工作(没有任何更改)。
似乎这个 属性 的默认值在 IdentityServer3
的某些较新版本中更改为 false
。
谢谢大家。
我正在学习 OAuth 2.0
和 Open Id Connect
,现在我遇到了一个问题:id_token
:
我已经创建了 InMemoryUser
并为他声明:
return new List<InMemoryUser>()
{
new InMemoryUser()
{
Username = "SomeName",
Password = "SomePassword",
Subject = "b05d3546-6ca8-4d32-b95c-77e94d705ddf",
Claims = new Claim[]
{
new Claim(IdentityServer3.Core.Constants.ClaimTypes.GivenName, "MyGivenName"),
new Claim(IdentityServer3.Core.Constants.ClaimTypes.FamilyName, "MyFamilyName"),
}
}
}
我的范围:
return new List<Scope>()
{
StandardScopes.OpenId,
StandardScopes.Profile,
new Scope()
{
Name = "somename",
DisplayName = "some display name",
Description = "some description",
Type = ScopeType.Resource
}
};
此外,我已经创建了 MVC 客户端和 Startup
class 并包含了配置文件 scope
:
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationType = "Cookies"
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
ClientId = "TripsHybrid",
Authority = Constants.Constants.TripsSts,
RedirectUri = Constants.Constants.TripsMvc,
SignInAsAuthenticationType = "Cookies",
ResponseType = "code id_token token",
Scope = "openid profile", // "profile" scope inсluded
}
}
但是当我获得 id_token
并对其进行解码时,没有我在创建 InMemoryUser
时设置的声明。此外,在将它们打印到 Debug
:
User.Identity.Claims
中没有声明
if (this.User.Identity.IsAuthenticated)
{
Debug.WriteLine("Claims:");
var identity = this.User.Identity as ClaimsIdentity;
foreach (var claim in identity.Claims)
{
Debug.WriteLine(claim.Type + " - " + claim.Value);
}
}
请帮我找出原因并在id_token
中添加声明。谢谢
对我来说一切都很好,但有时由于 identityserver 和 aspNetIdentity 中的声明之间的差异,声明没有正确映射
尝试清除 MVC 应用中的默认声明映射 Startup.cs:
// Clear The InboundClaimTypeMap
JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();
终于找到问题的解决方法了。
问题出在 IdentityServer3
NuGet 包版本中。在教程中使用了包 IdentityServer3 2.0.1
,但我已经安装了包 IdentityServer3 2.5.0
.
我在获取范围时更改了我的代码:
public static IEnumerable<Scope> Get()
{
Scope profileScope = StandardScopes.Profile;
profileScope.IncludeAllClaimsForUser = true; // set this property to true
return new List<Scope>()
{
StandardScopes.OpenId,
profileScope,
new Scope()
{
Name = "somename",
DisplayName = "some display name",
Description = "some description",
Type = ScopeType.Resource
}
};
}
我已经设置了 IncludeAllClaimsForUser = true
,现在所有声明都出现在身份令牌 (id_token
) 中,我可以使用此代码(与之前相同)在我的 MVC 客户端中获取所有声明:
if (this.User.Identity.IsAuthenticated)
{
Debug.WriteLine("Claims:");
var identity = this.User.Identity as ClaimsIdentity;
foreach (var claim in identity.Claims)
{
Debug.WriteLine(claim.Type + " - " + claim.Value);
}
}
当我尝试使用旧包时,问题中的代码按预期工作(没有任何更改)。
似乎这个 属性 的默认值在 IdentityServer3
的某些较新版本中更改为 false
。
谢谢大家。