OAuth 2.0和Open Id Connect声明问题

时间:2016-05-27 13:10:08

标签: c# oauth openid claims

我正在学习OAuth 2.0Open 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;} 中添加声明。感谢

2 个答案:

答案 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

谢谢大家。