9

Ich möchte eine MVC-Webanwendung erstellen, die mit einer Web-API-Anwendung kommuniziert und ADFS 2.0 (unter Windows 2008 R2) zur Authentifizierung verwendet.ADFS 2.0 Windows 2008 R2-Web-API

Ich schaffte es, die MVC-Webanwendung zur Authentifizierung mit ADFS zu machen.

F: Aber ich weiß nicht, wie ich meine ADFS 2.0 (unter Windows 2008 R2) von MVC Web zu Web API (vorausgesetzt, sie werden auf separaten Servern bereitgestellt werden) verbinden?

Browser-ADFS 2.0-Web MVC-Backend Web API

fand ich eine Menge von Artikeln, wie dies mit WCF oder Windows Server 2012 zu tun, R2, aber nicht mit Web-API und ADFS 2.0 in Windows Server 2008 R2


bearbeiten, Am Ende ging ich für poor man delegation (Übergabe des gleichen Token, die ich an das Front-End an das Back-End erhalten (wie es nicht sinnvoll wäre, die adfs wieder aufzurufen)

FrontEnd -> GetToken aufrufen und auf die Autorisierung Header (Ich kodiere es zu base64)

public string GetToken() 
{ 
    BootstrapContext bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as BootstrapContext; 
    string token = bootstrapContext.Token; 

    if (string.IsNullOrEmpty(token)) 
     token = ToTokenXmlString(bootstrapContext.SecurityToken as SamlSecurityToken); 

    return token; 
} 

string ToTokenXmlString(SecurityToken token) 
{ 
    var genericToken = token as GenericXmlSecurityToken; 

    if (genericToken != null) 
     return genericToken.TokenXml.OuterXml; 

    var handler = SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection(); 
    return ToTokenXmlString(token, handler); 
} 

string ToTokenXmlString(SecurityToken token, SecurityTokenHandlerCollection handler) 
{ 
    if (!handler.CanWriteToken(token)) 
     throw new InvalidOperationException("Token type not suppoted"); 

    var sb = new StringBuilder(128); 
    using (StringWriter stringWriter = new StringWriter(sb)) 
    { 
     using (var textWriter = new XmlTextWriter(stringWriter)) 
     { 
      handler.WriteToken(textWriter, token); 
      return sb.ToString(); 
     } 
    } 
} 

Backend-> Parsen und die Token->

public ClaimsIdentity GetIdentityFromToken(string tokenBase64) 
{ 
    if (string.IsNullOrEmpty(tokenBase64)) 
     return null; 

    byte[] tokenByteArray = Convert.FromBase64String(tokenBase64); 
    string decodedToken = Encoding.UTF8.GetString(tokenByteArray); 

    if (string.IsNullOrWhiteSpace(decodedToken)) 
     return null; 
    try 
    { 
     var handlers = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers; 
     SecurityToken token; 
     using (StringReader stringReader = new StringReader(decodedToken)) 
     { 
      using (XmlTextReader xmlReader = new XmlTextReader(stringReader)) 
      { 
       token = handlers.ReadToken(xmlReader); 
      } 
     } 

     if (token == null) 
      return null; 

     return handlers.ValidateToken(token).FirstOrDefault(); 
    } 
    catch (Exception e) 
    { 
     logger.Error(new AuthenticationException("Error validating the token from ADFS", e)); 

     return null; 
    } 
} 

Antwort

1

I, indem man die Träger-Token, das ich von Adfs in die Genehmigung Header des Web-API-Aufrufs empfing implementiert dies zu bestätigen, und dann das nuget-Paket Microsoft.Owin.Security.Jwt zu verwenden, um das Token während des Startvorgangs im Web-API-Projekt in die aktuelle Identität von httpcontext zu übersetzen.

In diesem Beispiel wird ein JWT-Token als Bearer-Token verwendet. Wählen Sie das richtige NuGet-Paket für den Tokentyp, den Sie verwenden möchten.

Konstruieren Sie die WebRequest in Mvc Controller

BootstrapContext bc = ClaimsPrincipal.Current.Identities.First().BootstrapContext as BootstrapContext; 
HttpWebRequest request = WebRequest.Create(ConfigurationManager.AppSettings["ApiUrl"]) as HttpWebRequest; 
request.Method = "GET"; 
request.Headers["Authorization"] = "Bearer " + bc.Token; 

Owin Startup.cs Datei in Web-api Vor dem app.UseWebApi (config) Linie.

app.UseJwtBearerAuthentication(
      new JwtBearerAuthenticationOptions 
      { 
       AuthenticationMode = AuthenticationMode.Active, 
       AllowedAudiences = new[] { ConfigurationSettings.AppSettings["ida:Realm"] }, 
       IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] 
        { 
         new SymmetricKeyIssuerSecurityTokenProvider(
          ConfigurationSettings.AppSettings["ida:ValidIssuer"], 
          ConfigurationSettings.AppSettings["ida:SymmetricKey"]) 
        }, 
       Provider = new OAuthBearerAuthenticationProvider 
       { 
        OnValidateIdentity = context => 
        { 
         return System.Threading.Tasks.Task.FromResult<object>(null); 
        } 
       } 
      }); 
+1

Das Problem ist, dass man nicht ADFS 2008 R2 machen JWT Token zu senden, und manchmal ist bc.Token null. Wenn Sie interessiert sind, schauen Sie in den Schnitt für die Lösung, die ich verwendet habe –