9

Chciałbym utworzyć aplikację sieci Web MVC, która rozmawia z aplikacją Web API i używa ADFS 2.0 (w Windows 2008 R2) do uwierzytelniania.ADFS 2.0 Windows Web API Windows 2000 R2

Udało mi się ustawić aplikację sieci Web MVC do uwierzytelniania za pomocą programu ADFS.

P: Ale nie wiem, jak powinienem połączyć mój ADFS 2.0 (w Windows 2008 R2) z MVC Web do Web API (zakładając, że będą one wdrożone na oddzielnych serwerach)?

Browser-ADFS 2.0-Web MVC-Backend Web API

Znalazłem wiele artykułów na temat jak to zrobić z WCF lub Windows Server 2012 R2, ale nie z sieci Web API i ADFS 2.0 w systemie Windows Server 2008 R2


Edycja W końcu poszedłem na poor man delegation (przekazując ten sam żeton, który otrzymuję na przód do backendu (ponieważ nie byłoby sensu ponownie wywoływać adfs)

FrontEnd -> Zadzwoń do GetToken i załóż autoryzację nagłówek (koduję go do 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-> analizowania i walidacji 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; 
    } 
} 

Odpowiedz

1

I wdrożone to przez przepuszczenie okaziciela tokenu, który otrzymałem od adfs w nagłówku autoryzacji rozmowy Web API a następnie za pomocą pakietu nuget Microsoft.Owin.Security.Jwt przetłumaczyć token na bieżącą tożsamość httpcontext podczas uruchamiania w projekcie web api.

W tym przykładzie użyto tokena jwt jako tokena na okaziciela. Wybierz odpowiedni pakiet NuGet dla typu tokena, którego chcesz użyć.

Narysuj WebRequest w MVC kontrolera

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; 

plik Owin Startup.cs w Web API Przed (config) linii app.UseWebApi.

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

Problem polega na tym, że nie można dokonać ADFS 2008 R2 wysłać JWT żeton, a czasem bc.Token jest null. Jeśli jesteś zainteresowany zajrzyj do edycji rozwiązania, którego użyłem –