Tôi muốn tạo một Ứng dụng Web MVC nói chuyện với một ứng dụng Web API và sử dụng ADFS 2.0 (trên Windows 2008 R2) để xác thực.ADFS 2.0 Windows 2008 R2 Web API
Tôi đã quản lý để làm cho Ứng dụng web MVC xác thực bằng cách sử dụng ADFS.
Q: Nhưng tôi không biết làm thế nào tôi nên liên kết ADFS 2.0 của tôi (trên Windows 2008 R2) từ MVC Web đến Web API (giả sử chúng sẽ được triển khai trong các máy chủ riêng biệt)?
tôi thấy rất nhiều bài viết về cách để làm điều này với WCF hoặc Windows Server 2012 R2, nhưng không phải với Web API và ADFS 2.0 trong Windows Server 2008 R2
Chỉnh sửa, Cuối cùng tôi đã đi cho poor man delegation (đi qua cùng một mã thông báo mà tôi nhận được để kết thúc trước để phụ trợ (vì nó sẽ không có ý nghĩa để gọi các adfs một lần nữa)
FrontEnd -> Gọi GetToken và đưa vào ủy quyền tiêu đề (tôi mã hóa nó để 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-> Parse và kích hoạt các 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;
}
}
Vấn đề là bạn không thể tạo ADFS 2008 R2 gửi mã thông báo JWT và đôi khi bc.Token không có giá trị. Nếu bạn quan tâm, hãy tìm chỉnh sửa cho giải pháp mà tôi đã sử dụng –