/ / Token AAD z aplikacji SPA działa w celu wywoływania interfejsu API Nodejs, ale nie .Net WebAPI - asp.net-web-api, katalog-Lazur-aktywny, msal

Token AAD z aplikacji SPA działa w celu wywoływania interfejsu API Nodejs, ale nie .Net WebAPI - asp.net-web-api, katalog-azure-aktywny, msal

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 № 1

Podobny 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,
});