2016-07-08 12 views
1

konvertieren Ich habe eine 3-Tier-Anwendungsstruktur. Es gibt eine cordova js-Anwendung für Endbenutzer, eine Implementierung von identityserver3, die als OpenID-Berechtigung dient, und eine MVC-Anwendung, auf die über einen In-App-Browser in der cordova-Anwendung zugegriffen wird.Wie Bearer-Token in Authentifizierungs-Cookie für MVC-App

Der Einstiegspunkt für Benutzer ist die cordova App. Sie melden sich dort über einen In-App-Browser an und können dann auf Anwendungsfunktionen zugreifen oder auf einen Link klicken, um den In-App-Browser zu öffnen und die MVC-App aufzurufen.

Unsere Strategie der MVC Website zur Sicherung war Inhaber Token-Authentifizierung zu verwenden, da wir schon einmal aus der App angemeldet und wollten nicht den Benutzer aufzufordern, sich wieder anmelden, wenn sie in dem MVC-app gerichtet waren:

app.Map("/account", account => 
{ 
    account.UseIdentityServerBearerTokenAuthentication(new IdentityServer3.AccessTokenValidation.IdentityServerBearerTokenAuthenticationOptions() 
    { 
     Authority = "https://localhost:44333/core", 
     RequiredScopes = new string[] { "scope" }, 
     DelayLoadMetadata = true, 
     TokenProvider = new QueryStringOAuthBearerProvider(), 
     ValidationMode = ValidationMode.ValidationEndpoint, 
    }); 
} 

die access_token auf dem Query-String Seit persistierende schmerzhaft ist, implementiert ich einen benutzerdefinierten OAuthBearerAuthenticationProvider:

public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider 
{ 
    private static ILog logger = LogManager.GetLogger(typeof(QueryStringOAuthBearerProvider)); 
    public override Task RequestToken(OAuthRequestTokenContext context) 
    { 
     logger.Debug($"Searching for query-string bearer token for authorization on request {context.Request.Path}"); 

     string value = GetAccessTokenFromQueryString(context.Request); 

     if (!string.IsNullOrEmpty(value)) 
     { 
      context.Token = value; 
      //Save the token as a cookie so the URLs doesn't need to continue passing the access_token 
      SaveAccessTokenToCookie(context.Request, context.Response, value); 
     } 
     else 
     { 
      //Check for the cookie 
      value = GetAccessTokenFromCookie(context.Request); 
      if (!string.IsNullOrEmpty(value)) 
      { 
       context.Token = value; 
      } 
     } 

     return Task.FromResult<object>(null); 
    } 
    [cookie access methods not very interesting] 
} 

Dies funktioniert, und ermögliche es die MVC-Anwendung nicht das Zugriffstoken in jede Anfrage bestehen, aber s das Zugriffstoken als nur ein generisches Cookie zu behandeln, scheint falsch zu sein.

Was ich stattdessen wirklich tun möchte, ist die Verwendung des Zugriffstokens, um mit dem OpenID-Endpunkt zu arbeiten und einen Forms-Auth-Stil-Cookie auszugeben, der auf Abmeldung reagiert. Ich habe gefunden, dass ich account.UseOpenIdConnectAuthentication(..) hinzufügen kann, aber wenn ich über access_token authentifiziere, werden die OpenIdConnectAuthentication Bits einfach übersprungen. Irgendwelche Ideen?

Antwort

2

Sie nicht - Access-Tokens sind für den Aufruf von Web-Apis konzipiert. Sie verwenden das ID_Token von OIDC, um den Benutzer zu authentifizieren, und aus den Ansprüchen, in denen Sie sich befinden, geben Sie Ihr lokales Authentifizierungs-Cookie aus. Die Microsoft OpenIdConnect-Authentifizierungs-Middleware wird das meiste dieses schweren Hebens für Sie erledigen.

+0

Gibt es irgendwo einen Haken, an den ich diese Logik einschleusen kann? Das BearerTokenAuth-Bit hat keine Rückrufe und die in "UseOpenIdConnectAuthentication" bereitgestellten Benachrichtigungen scheinen nicht angemessen. Vielleicht ein Authentifizierungsfilterattribut? – K0D4

+0

Die UseOpenIdConnectAuthentication MW gibt das Cookie für Sie aus. Wenn Sie die im Cookie ausgegebenen Ansprüche ändern müssen, behandeln Sie das SecurityTokenValidated-Ereignis. –

+0

Danke für die Klarstellung Brock, Wenn ich richtig verstehe, sollte ich die Bearer Auth Config komplett entfernen und durch UseOpenIDConnectAuthentication ersetzen. Dort schaue ich auf die Abfragezeichenfolge, ziehe das Token heraus und autorisiere dann mit OIDC, handle mit ClaimsIdentity und setze ein Authentifizierungsticket. Alternativ dazu, wenn ich beide Authentifizierungsdinge drin habe, müsste ich eine Möglichkeit haben, sie zu verketten, aber es scheint, wenn ich einen BearerToken habe, wird die andere Authentifizierungsroutine komplett übersprungen. – K0D4

Verwandte Themen