7

Kurz: Mein Client ruft ein Zugriffstoken vom IdentityServer-Beispielserver ab und übergibt es dann an mein WebApi. In meinem Controller gibt this.HttpContext.User.GetUserId() null zurück (der Benutzer hat andere Ansprüche). Ich vermute, dass der Zugriffstoken keinen Namensidentitätsanspruch hat. Wie kann ich IdentityServer einbinden?Wie kann IdentityServer eine Benutzeridentität zum Zugriffstoken hinzufügen?

Was ich bisher versucht:

  • wechselte von Hybrid zu impliziter Strömung (random Versuch)
  • in IdSvrHost Umfang Definition habe ich hinzugefügt

    Ansprüche = {new ScopeClaim (ClaimTypes.NameIdentifier, alwaysInclude: true)}

  • in IdSvrHost Client Definition, die ich hinzugefügt haben

    Ansprüche = {neue Claims (ClaimTypes.NameIdentifier "42")}

(auch ein statistisches Versuch)

Ich habe auch versucht, andere Bereiche in Umfangsdefinition, und keiner von ihnen erschienen . Es scheint, dass die Namensidentität normalerweise im Identitäts-Token enthalten ist, aber für die meisten öffentlichen APIs, die mir bekannt sind, geben Sie dem Server kein Identitäts-Token. Weitere Details: IdSrvHost und Api sind auf verschiedenen Hosts. Controller hat [Autorisieren]. Tatsächlich kann ich andere Behauptungen kommen sehen. Api ist so konfiguriert, mit

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 

app.UseIdentityServerAuthentication(options => { 
    options.Authority = "http://localhost:22530/"; 

    // TODO: how to use multiple optional scopes? 
    options.ScopeName = "borrow.slave"; 
    options.AdditionalScopes = new[] { "borrow.receiver", "borrow.manager" }; 

    options.AutomaticAuthenticate = true; 
    options.AutomaticChallenge = true; 
}); 

Scope:

public static Scope Slave { get; } = new Scope { 
    Name = "borrow.slave", 
    DisplayName = "List assigned tasks", 
    Type = ScopeType.Resource, 

    Claims = { 
     new ScopeClaim(ClaimTypes.NameIdentifier, alwaysInclude: true), 
    }, 
}; 

und Client:

new Client { 
    ClientId = "borrow_node", 
    ClientName = "Borrow Node", 

    Flow = Flows.Implicit, 

    RedirectUris = new List<string> 
    { 
     "borrow_node:redirect-target", 
    }, 

    Claims = { new Claim(ClaimTypes.NameIdentifier, "42") }, 

    AllowedScopes = { 
     StandardScopes.OpenId.Name, 
     //StandardScopes.OfflineAccess.Name, 
     BorrowScopes.Slave.Name, 
    }, 
} 

Auth URI:

request.CreateAuthorizeUrl(
      clientId: "borrow_node", 
      responseType: "token", 
      scope: "borrow.slave", 
      redirectUri: "borrow_node:redirect-target", 
      state: state, 
      nonce: nonce); 

und ich habe auch versucht,

request.CreateAuthorizeUrl(
      clientId: "borrow_node", 
      responseType: "id_token token", 
      scope: "openid borrow.slave", 
      redirectUri: "borrow_node:redirect-target", 
      state: state, 
      nonce: nonce); 
+0

Wenn Sie nicht sicher sind, was im access_token ist, kopieren Sie es und fügen Sie es in jwt.io ein und sehen Sie sich diese Ansprüche an. –

+0

Hier ist, was ich in access_token erhalten: { "iss": "http: // localhost: 22530", "Aud": "http: // localhost: 22530/Ressourcen", "exp": 1460323801, "NBF": 1460320201, "client_id": "borrow_node" "Scope": "borrow.slave" "sub": "88.421.113" "auth_time": 1460320200, "IDP": "idsvr" } - nein name identity claim – LOST

+0

Übrigens, ich will nicht, dass die namenidentität "42" ist, das war nur ein Versuch zu sehen, ob sich das ändert. – LOST

Antwort

4

Hooray, fand ich eine Antwort, wenn ich auf dieser Seite gestolpert: https://github.com/IdentityServer/IdentityServer3.Samples/issues/173

Offenbar Benutzeridentität in "sub" Anspruch im Zugriffstoken übergeben wird. Da ich blind API Probe kopiert, seine Konfiguration enthalten

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 

meinen, die im wesentlichen aus API-Mapping „sub“ Anspruch Nameidentifier verhindert. Nach dem Entfernen dieser Zeile gibt HttpContext.User.GetUserId() des authentifizierten Controllers die Benutzer-ID korrekt zurück.