Mam aplikację SPA, która używa MSAL donabyć token od AAD. Ponieważ MSAL działa z punktem końcowym v2, a punkt końcowy v2 nie obsługuje obecnie tokenów wystawiania dla niestandardowych interfejsów API, przekazuję token ID do mojego api i zasadniczo traktuję mój api jako tę samą aplikację. (Chociaż ma to zapach, to działa - przynajmniej z interfejsem API Nodejs).
Aplikacja SPA
let idToken = Msal.Storage("localStorage").getItem(Msal.Constants.idTokenKey);
this.http.configure(config => {
config.withBaseUrl("http://localhost:3001/")
config.withDefaults({headers: {"Authorization": "Bearer " + idToken}})
});
//Call API
this.http.fetch("account")
...
Interfejs API Node.js
//Using express/passport
var BearerStrategy = require("passport-azure-ad").BearerStrategy;
var options = {
identityMetadata: "https://login.microsoftonline.com/tenantid/.well-known/openid-configuration/",
clientID: "xxxxxxx-xxxx-xxxxxxx-xxxxx",
passReqtoCallback: false,
validateIssuer: true,
issuer: "http://login.microsoftonline.com/{tenantid}/v2.0"
};
app.get("/account",passport.authenticate("oauth-bearer",{session: false}),...
Powyższe wszystko działa. Po uwierzytelnieniu użytkownika w SPA następuje przekazanie tokena i wywołanie funkcji API węzła.
Obecnie próbuję zastąpić interfejs API Nodejs interfejsem WebNet .NET.
Startup.cs
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
TokenValidationParameters = new TokenValidationParameters
{
//Same ID as used for ClientID in Nodejs
ValidAudience = "xxxxxx-xxxxx-xxxxx-xxxxx",
ValidIssuer = "https://login.microsoftonline.com/{tenantid}/v2.0",
ValidateIssuer = true,
AuthenticationType = "WebApi" //Tried both with and without this
},
Tenant = "{tenantid}" //have tried both id and name
}
)
AccountController.cs
[Authorize]
[Route("account")]
public IHttpActionResult AccountProfile(){
//Get Account information
....
return Ok(profile);
}
Jednak gdy wskażę aplikację SPA, aby wywołać aplet .Net, zawsze otrzymuję Authorization has been denied for this request
.
Czy jest coś, czego mi brakuje?
Edytować
Nawiasem mówiąc, sprawdziłem token, który jest używany.
Wartość, której używam dla clientID
(Nodejs) i ValidAudience
(.Net) dokładnie pasuje do aud
roszczenie w tokenie. The issuer
(Nodejs) i ValidIssuer
(.Net) dokładnie pasuje do iss
roszczenie w tokenie. Wreszcie, gdziekolwiek w moim kodzie, w którym wstawiłem {tenantid}, rzeczywista wartość tam dokładnie pasuje tid
roszczenie w tokenie.
Odpowiedzi:
0 dla odpowiedzi № 1Podobny problem wystąpił podczas przełączania z ADAL na MSAL i uruchomiliśmy go przy użyciu podobnego podejścia, jak ten projekt Github. W szczególności spójrz na te pliki:
https://github.com/oktadeveloper/okta-oauth-aspnet-codeflow/blob/master/Api/Startup.cs https://github.com/oktadeveloper/okta-oauth-aspnet-codeflow/blob/master/Api/OpenIdConnectCachingSecurityTokenProvider.cs
Aktualizacja: Nasze pliki Startup.cs:
var provider = new OpenIdConnectCachingSecurityTokenProvider(
string.Format(bc2Instace, tenant, policyId));
var jwt = new JwtFormat(clientId, provider);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
{
AccessTokenFormat = jwt,
});