2013-06-24 9 views
5

ich viele Artikel bekam und SO basierend Frage auf Anspruch basierte Authentifizierung für WCF Restful Dienste, aber ich bin mit MVC Web API RESTful Service (Nicht WCF Rast Service) zu entwickeln ...mit wif mit Web-api

Könnten Sie mir bitte helfen, zu verstehen, wie man RESTful-Service mit Claim-basierter Authentifizierung sichert? Hier

ist das, was ich brauche:

  1. Ich habe eine Web-App und MVC4 Web-API-Service
  2. Wir haben STS
  3. Die MVC Web App die STS vertraut
  4. nun der Benutzer anmeldet In die Web App wird er auf die STS Login Seite weitergeleitet.
  5. Sobald er eingeloggt ist, wird er zurück zur MVC Website geleitet.
  6. Diese Webanwendung ruft den Web-API-Dienst auf.

Jetzt bin ich bei Punkt # 4 stecken geblieben. Wir haben einen REST-Service, müssen aber WIF implementieren.

Kann mir bitte jemand dabei helfen.

Hinweis: Ich bin nicht mit WCF Restservice aber unter Verwendung von MVC Web API

Antwort

11

Aus Ihrer Beschreibung, es klingt wie Sie eine delegierte Identitätsmodell verwenden . Das heißt, der Benutzer meldet sich bei der Webanwendung an, und wenn die Webanwendung den Web-API-Dienst aufruft, verwendet er die Identität des aktuell angemeldeten Benutzers.

Wenn dies der Fall ist, müssen Sie WIF konfigurieren, um die "Bootstrap-Tokens" zu speichern. Dies hat zur Folge, dass das ursprüngliche Sicherheitstoken als Eigenschaft für die aktuelle ClaimsIdentity verfügbar ist. Anschließend können Sie den Authorize-Header der Anforderung für den Web-API-Serviceaufruf festlegen.

dies So schalten Sie in .Net 4.5 Sie das saveBootstrapContext Attribut auf dem WIF-Element auf true gesetzt:

<system.identityModel> 
    <identityConfiguration saveBootstrapContext="true"> 
    ... 

Für 4 .Net, die Config-lke folgt aussieht:

<microsoft.identityModel> 
    <service saveBootstrapTokens="true"> 
    ... 

Dann Um von der Webanwendung aus darauf zuzugreifen, tun Sie etwas (abhängig davon, wie viele Identitäten Sie haben) dies im Controller, der die Web-API aufrufen wird. Für .Net 4.5:

SecurityToken token = (User as ClaimsPrincipal).Identities[0].BootstrapContext; 

Für.Net 4: auf die Anrufe an die Web-API als Autorisieren Header

SecurityToken token = (User as ClaimsPrincipal).Identities[0].BootstrapToken; 

Nachdem das ursprüngliche Sicherheitstoken erhalten, können Sie es jetzt anhängen. Im Allgemeinen wird dies als Bearer-Token angehängt, was nur eine phantastische Art ist, zu sagen, dass Sie das Wort "Bearer" an den Anfang des Header-Wertes anhängen. Um das Token anhängen, tun Sie etwas wie folgt aus:

WebClient request = new WebClient(); 
request.Headers.Add("Authorization","bearer " + tokenAsString); 

Hinweis: Im Allgemeinen werden Sie verschlüsseln oder Base64 codieren die Token-Wert im Transit statt die rohen String anhängen, vor allem, wenn es XML ist, da einige Frameworks Mangle das XML im Transit.

Um das Token in eine Zeichenfolge zu konvertieren, sollten Sie eine Klasse verwenden, die von SecurityTokenHandler abgeleitet ist. Es gibt eine Reihe von diesen in den Standard-Framework-Assemblies zum Behandeln einiger Standard-Token-Typen. Für REST-Service, ist die JSON Web Token ein beliebtes Format, und es gibt ein NuGet Paket einen Handler für die hier

https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/

Wenn Sie einen anderen Token-Typen enthält, verwenden, können Sie Ihre eigenen Handler schreiben (es ist in der Tat nicht schwierig) oder versuchen, im Internet zu finden.

In .Net 4.5 verfügt die Klasse SecurityTokenHandler über eine WriteToken(SecurityToken)-Methode, die das Token als Zeichenfolge zurückgibt. In früheren Versionen von WIF wurde nur die XML-Version von WriteToken unterstützt.

In einigen Beispielen wird gezeigt, wie der SecurityTokenHandler für REST-Dienste auf der Serverseite verwendet wird. Ein gutes Beispiel ist hier

http://code.msdn.microsoft.com/AAL-Native-App-to-REST-de57f2cc/view/Discussions#content

Alle relevanten Code wird in der global.asax.cs Datei enthalten.

+0

, wie man es anschließt und WEB-API aufruft ..... konnten Sie ein Beispiel zur Verfügung stellen .... oder Beispielcode? –

+1

Könnten Sie bitte auch ein Beispiel für den Aufruf der gleichen mit JavaScript (Wie können wir anhängen Token in diesem Fall), auch aus Ihrer Antwort ist es nicht klar, was sollte die Config/Code auf der Service-Seite sein .....? –

+0

auch am Dienstende, wie man die Elemente des claimset wie emailid, userid etc .... sieht, der normalerweise während des Generierens der Ansprüche von st hinzugefügt wird. –

1

Wenn Ihr Kunde den Dienst Ihres Web-Api nicht authentifiziert wird, sollte eine 401 Unauthorized Antwort zurück.

Es wird dann Ihre Kunden verantwortungsvoll, Authentifizierung zu suchen und ein neues Token zu erhalten. Sie sollten den Link auf Ihre Log-in Form im WWW-Authenticate-Header

Dieses Video zurückkehren helfen könnte - Securing ASP.NET Web APIs http://vimeo.com/43603474

+0

Ich hatte bereits den Link, den Sie bereitgestellt hatten .... aber ich kann kein anderes Framework verwenden .... wie wir haben, Rest Service & Web-App an Ort und Stelle .... wir müssen nur herumspielen diese, um es zu erledigen .... verwendet möglicherweise Microsoft-Identitätsmodell –