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?
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;
}
}
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 –