Я хотел бы сделать веб-приложение 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 (при условии, что они будут развернуты на разных серверах)?
Я нашел много статей о том, как сделать это с помощью 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;
}
}
Проблема заключается в том, что вы не можете сделать ADFS 2008 R2, чтобы отправить JWT маркер, а иногда bc.Token равна нулю. Если вам интересно посмотреть в редакции для решения, которое я использовал –