9

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)?

Browser-ADFS 2.0-Web MVC-Backend Web API

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

Trả lời

1

tôi thực hiện điều này bằng cách đi qua các dấu hiệu mang mà tôi nhận được từ ADFS vào tiêu đề ủy quyền của các cuộc gọi web api, và sau đó sử dụng gói Microsoft.Owin.Security.Jwt nuget để dịch mã thông báo vào danh tính hiện tại httpcontext trong khi khởi động owin trong dự án api web.

Ví dụ này sử dụng mã thông báo jwt làm mã thông báo mang. Chọn gói NuGet thích hợp cho loại mã thông báo mà bạn muốn sử dụng.

Xây dựng các WebRequest trong bộ điều khiển 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; 

tập tin Owin Startup.cs trong web api Trước (config) dòng 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

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 –

Các vấn đề liên quan