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!
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. –
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? –
Ja. Das ist der Grund. Laut dem offiziellen Beispiel ist ApplicationID erforderlich. – Amor