我正在学习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
类,并包含了个人资料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
时没有设置声明。此外,将User.Identity.Claims
打印到Debug
后,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
请帮助我找到原因并在#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
int main () {
int n;
cout<<"-------------------------KODER/DEKODER-------------------------"<<endl;
ofstream Info;
Info.open("Info.txt");
Info<<"KODER_DEKODER verzija 1.0.0\nOvaj program je napisan kako bi se brzo dekadni broj pretvorio u binarni i obrnuto bez previse razmisljanja"<<endl;
Info.close();
cout<<"NAPOMENA: Uneseni brojevi i binarne kombinacije moraju biti izmedu brojeva 0 i 15"<<endl;
cout<<"Unesite 1 ako zelite kodirati dekadni broj u binarni, a ako zelite dekodirtai binarni broj u dekadni unesite broj 2"<<endl;
cin>>n;
int d,b;
if (n==1){
cout<<"Unesite dekadni broj koji zelite kodirati u binarni"<<endl;
cin>>d;
if (d==0){
cout<<"Vas kodirani dekadni broj glasi 0000"<<endl;
}else if (d==1){
cout<<"Vas kodirani dekadni broj glasi 0001"<<endl;
}else if (d==2){
cout<<"Vas kodirani dekadni broj glasi 0010"<<endl;
}else if (d==3){
cout<<"Vas kodirani dekadni broj glasi 0011"<<endl;
}else if (d==4){
cout<<"Vas kodirani dekadni broj glasi 0100"<<endl;
}else if(d==5){
cout<<"Vas kodirani dekadni broj glasi 0101"<<endl;
}else if (d==6){
cout<<"Vas kodirani dekadni broj glasi 0110"<<endl;
}else if (d==7){
cout<<"Vas kodirani dekadni broj glasi 0111"<<endl;
}else if (d==8){
cout<<"Vas kodirani dekadni broj glasi 1000"<<endl;
}else if (d==9){
cout<<"Vas kodirani dekadni broj glasi 1001"<<endl;
}else if(d==10){
cout<<"Vas kodirani dekadni broj glasi 1010"<<endl;
}else if (d==11){
cout<<"Vas kodirani dekadni broj glasi 1011"<<endl;
}else if(d==12){
cout<<"Vas kodirani dekadni broj glasi 1100"<<endl;
}else if(d==13){
cout<<"Vas kodirani dekadni broj glasi 1101"<<endl;
}else if(d==14){
cout<<"Vas kodirani dekadni broj glasi 1110"<<endl;
}else if(d==15){
cout<<"Vas kodirani dekadni broj glasi 1111"<<endl;
}
else {
cout<<"Unesi broj izmedu 0 i 15"<<endl;
return main();
}
}
else if (n==2) {
cout<<"Unesite binarni broj koji zelite pretvoriti u dekadni"<<endl;
cin>>b;
if (b==0000) {
cout<<"Vasa binarna kombinacija daje broj 0"<<endl;
} else if (b==0001) {
cout<<"Vasa binarna kombinacija daje broj 1"<<endl;
} else if (b==0010) {
cout<<"Vasa binarna kombinacija daje broj 2"<<endl;
} else if (b==0011) {
cout<<"Vasa binarna kombinacija daje broj 3"<<endl;
} else if (b==0100) {
cout<<"Vasa binarna kombinacija daje broj 4"<<endl;
} else if (b==0101) {
cout<<"Vasa binarna kombinacija daje broj 5"<<endl;
} else if (b==0110) {
cout<<"Vasa binarna kombinacija daje broj 6"<<endl;
} else if (b==0111) {
cout<<"Vasa binarna kombinacija daje broj 7"<<endl;
} else if (b==1000) {
cout<<"Vasa binarna kombinacija daje broj 8"<<endl;
} else if (b==1001) {
cout<<"Vasa binarna kombinacija daje broj 9"<<endl;
} else if (b==1010) {
cout<<"Vasa binarna kombinacija daje broj 10"<<endl;
} else if (b==1011) {
cout<<"Vasa binarna kombinacija daje broj 11"<<endl;
} else if (b==1100) {
cout<<"Vasa binarna kombinacija daje broj 12"<<endl;
} else if (b==1101) {
cout<<"Vasa binarna kombinacija daje broj 13"<<endl;
} else if (b==1110) {
cout<<"Vasa binarna kombinacija daje broj 14"<<endl;
} else if (b==1111) {
cout<<"Vasa binarna kombinacija daje broj 15"<<endl;
}
else{
cout<<" Unesi pravilnu binarnu kombinaciju"<<endl;
return main();}
}
else {
cout<<"UNESITE 1 ZA KODIRANJE ILI 2 ZA DEKODIRANJE"<<endl;
return main();}
system("pause");
return 0;}
中添加声明。感谢
答案 0 :(得分:1)
对于我来说,每件事情都可以,但有些时候由于身份服务器和aspNetIdentity中的声明之间的差异,声明没有正确映射
尝试清除MVC应用程序Startup.cs中的默认声明映射:
// Clear The InboundClaimTypeMap
JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();
答案 1 :(得分:0)
最后,我找到了问题解决方案。
问题出在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);
}
}
当我尝试使用旧版软件包时,我的问题中的代码按预期工作(没有任何更改)。
在某些较新版本的false
中,此属性的默认值似乎已更改为IdentityServer3
。
谢谢大家。