2017-06-14 3 views
0

Ich versuche, eine Web-API 2 mit MSAL zu sichern. Meine Authentifizierung Client-Seite funktioniert und ich bekomme ein gültiges Token (verifiziert mit jwt.io).HTTP-Anfrage trifft nicht auf Web API 2 Controller

Ich habe eine Web-API-2 als solche konfiguriert:

Die WebAPI Config:

public static void Register(HttpConfiguration config) 
{ 
    config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All; 
    config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
    config.EnableCors(); 
    config.MapHttpAttributeRoutes(); 
    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
     ); 
} 

sieht mein Startup.Auth.cs wie folgt aus:

 public void ConfigureAuth(IAppBuilder app) 
    { 
     string clientId = "the_client_id"; 

     var tokenValidationParameters = new TokenValidationParameters 
     { 
      ValidAudience = clientId, 
      ValidateIssuer = false 
     }; 
     Debug.WriteLine("Client ID = " + tokenValidationParameters.ValidAudience); 
     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions 
     { 
      AccessTokenFormat = new Microsoft.Owin.Security.Jwt.JwtFormat(tokenValidationParameters, new OpenIdConnectCachingSecurityTokenProvider("https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration")) 
     }); 
    } 

und eine einfache Steuerung :

[Authorize] 
[EnableCors(origins: "*", headers: "*", methods: "*")] 
public class BundlesController : ApiController 
{ 
    private APIContext db = new APIContext(); 

    // GET: api/Bundles 
    public IQueryable<Bundles> GetBundles() 
    { 
     Claim subject = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier); 
     db.Configuration.ProxyCreationEnabled = false; 
     return db.Bundles.Include(x => x.Products.Select(y => y.Defects)); 
    } 

Bevor die Attribute [Autorisieren] hinzugefügt wurden, funktionierte die API wie ein Charm und gab die Daten korrekt zurück.

Wenn ich einen Breakpoint in der GET-Funktion vom Controller gesetzt habe, wird es nicht getroffen und ich bekomme 401: Autorisierung wurde für diese Anfrage verweigert. Ich bin mir ziemlich sicher, dass ich meine App korrekt in apps.dev.microsoft.com registriert habe.

Ich verstehe nicht, an welchem ​​Punkt meine API die Anrufe blockiert. Jeder Vorschlag wird sehr geschätzt!

Vielen Dank!

Antwort

0

Entschuldigung für die Störung!

Mein Problem war, dass ich aus dem App das Token-Verfahren wurde aufrufen, die Art und Weise:

App.IdentityClientApp.AcquireTokenAsync(new String[] { premissionScopes }); 

Wenn ich ja

App.IdentityClientApp.AcquireTokenAsync(new String[] { Constants.ApplicationID }); 

So hätte tun sollen, sollen Sie das erste erhalten token Sie mit der Anwendungs-ID und geben Sie dann die Gültigkeitsbereiche an die Methode zum Akquirieren stiller Token an, sobald Sie das Token haben.

0

Hallo können Sie bitte versuchen, unterstützt Anmeldeinformationen: wahr zu Ihrem Kors ?. So Attribut Ihr EnableCors so etwas wie dieses

EnableCors [origin:*,headers:*,methods:*,supportsCredentials:true] 

hoffe, das hilft aussehen würde.

Danke, Bhadhri

2

ich Ihren Code nur getestet sowohl auf meinem lokalen und Azure Web App. Alles hat gut funktioniert. Die API könnte nach dem Hinzufügen von [Authorize] -Attributen erreicht werden.

Meine Authentifizierung Client-Seite funktioniert und ich bekomme ein gültiges Token (verifiziert mit jwt.io).

Token wird abgelaufen abhängig von der exp-Eigenschaft von JWT. Standardmäßig ist es in 60 Minuten abgelaufen. Versuchen Sie, das Token erneut zu generieren, und verwenden Sie es, um auf Ihre Web-API zuzugreifen.

+0

Vielen Dank für Ihre Antwort. Ich rufe AcquireTokenSilentAsync vor jedem API-Aufruf auf. Wenn ich richtig verstehe, sollte ich ein Token bekommen und das Ablaufdatum verlängern.Zu Testzwecken logge ich mich immer ein, so dass der Ablauf kein Problem sein sollte. –

+0

Ich bekam das Token so: AcquireTokenAsync (new String [] {"User.Read"}) und änderte es in AcquireTokenAsync (new String [] {applicationID}) Es scheint zu funktionieren. Glaubst du, dass das Problem von hier kommt? –

+1

Ja. Das ist der Grund. Laut dem offiziellen Beispiel ist ApplicationID erforderlich. – Amor