9

Я хотел бы сделать веб-приложение MVC, которое говорит с приложением веб-API и использует ADFS 2.0 (для Windows 2008 R2) для аутентификации.ADFS 2.0 Веб-API Windows 2008 R2

Мне удалось сделать веб-приложение MVC для аутентификации с использованием ADFS.

Вопрос: Но я не знаю, как я должен объединить ADFS 2.0 (в Windows 2008 R2) с MVC Web в Web API (при условии, что они будут развернуты на разных серверах)?

Browser-ADFS 2.0-Web MVC-Backend Web API

Я нашел много статей о том, как сделать это с помощью WCF или Windows Server 2012 R2, но не с Web API и ADFS 2.0 в Windows Server 2008 R2


Edit, В конце я пошел за poor man delegation (передав тот же токен, который я получаю на переднем конце бэкэнд (так как было бы бессмысленно снова звонить adfs)

FrontEnd -> Позвонить GetToken и ввести авторизацию заголовок (я кодирую его в 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-> Анализировать и проверить 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; 
    } 
} 

ответ

1

Я реализовал это путем передачи маркера носителя, который я получил от компьютера ADFS в заголовок авторизации вызова Web API, а затем с помощью пакета nuuet.Ru.Security.Jwt для преобразования токена в текущую идентификацию httpcontext во время запуска owin в проекте web api.

В этом примере используется токен jwt как токен-носитель. Выберите нужный пакет NuGet для типа маркера, который вы хотите использовать.

Построить WebRequest в MVC контроллер

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 файл в веб-апи Перед (конфигурации) линии 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

Проблема заключается в том, что вы не можете сделать ADFS 2008 R2, чтобы отправить JWT маркер, а иногда bc.Token равна нулю. Если вам интересно посмотреть в редакции для решения, которое я использовал –

Смежные вопросы