根据OpenID Connect specification sub
声明openid
范围或profile
范围的一部分?我找不到那些信息
UPDATE1
我使用IdentityServer3进行身份验证。客户端正在向服务器发出请求,如下所示。作为回应,我不会根据Open ID Connect规范获得sub
声明。但是,响应包含http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
,其值与sub
相同nameidentifier
与sub
相同。
这是客户请求
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies"
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "https://localhost:44314/identity",
Scope = "openid",
ClientId = "LocalHostMvcClient",
RedirectUri = "http://localhost:34937/",
ResponseType = "id_token",
SignInAsAuthenticationType = "Cookies",
}
}
id_token回复
更新2
基于以下评论,我更新了客户端的启动文件
private void TurnOffMicrosoftJWTMapping()
{
//The long claim names come from Microsoft’s JWT handler trying to map some claim types to .NET’s ClaimTypes class types.
//We can turn off this behavior with the following line of code (in Startup).
//This also means that we need to adjust the configuration for anti-CSRF protection to the new unique sub claim type:
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Subject;
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
}
然后在客户端的启动中调用此方法
public class Startup
{
public void Configuration(IAppBuilder app)
{
TurnOffMicrosoftJWTMapping();
//configure OpenIDConnect request here
}
}
答案 0 :(得分:10)
sub是id_token的必需声明 - 而openid范围是发出OpenID Connect身份验证请求所需的最小范围。你可以将openid与其他范围混合 - 但必须存在openid。
这是他们的关系。
IdentityServer根据以下内容发出标准声明类型(例如sub)
https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims
Microsoft JWT处理程序将这些标准声明转换为Microsoft专有声明。你可以通过以下方式解决这个恼人的行为:
JwtSecurityTokenHandler.InboundClaimTypeMap.Clear()
答案 1 :(得分:2)
两者都没有,只要required claim of the ID Token,只要发出一个{{3}}。