9

Bir Web API uygulamasıyla görüşen ve kimlik doğrulaması için ADFS 2.0 (Windows 2008 R2'de) kullanan bir MVC Web Uygulaması yapmak istiyorum.ADFS 2.0 Windows 2008 R2 Web API'si

MVC Web Uygulamasını, ADFS kullanarak kimlik doğrulaması yapmayı başardım.

S: Ancak, ADFS 2.0 (Windows 2008 R2'de) MVC Web'den Web API'ye nasıl dağıtımı yapmam gerektiğini bilmiyorum (ayrı sunucularda dağıtılacağını varsayarak)?

Browser-ADFS 2.0-Web MVC-Backend Web API

Ben, R2 ancak Windows Server 2008 R2


Düzenleme Web API ve ADFS'de 2.0 ile WCF veya Windows Server 2012 ile bunu nasıl çok makale bulundu Sonunda ben poor man delegation için gittim (arka ucun arka ucuna aldığım aynı belirteci geçerek (tekrar adfs'ı çağırmak mantıklı olmaz)

FrontEnd -> GetToken'i arayın ve yetkilendirmeyi yapın. başlık (onu kodlarım base64 için)

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-> Ayrıştırma ve I web API çağrısı yetkilendirme başlığına adfs alınan taşıyıcı belirteci geçirerek bu uygulamaya

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

> Belirteci

cevap

1

doğrulamak ve sonra web api projesinde owin başlangıcı sırasında belirteci httpcontext geçerli kimliğine çevirmek için Microsoft.Owin.Security.Jwt nuget paketini kullanarak.

Bu örnekte, taşıyıcı belirteci olarak bir jwt belirteci kullanılmıştır. Kullanmak istediğiniz belirteç türü için uygun NuGet paketini seçin.

app.UseWebApi (geneli) doğrultusunda önce ağ API MVC denetleyicisi

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 dosyasını WebRequest oluşturun.

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

sorun JWT simge gönderir ADFS 2008 R2 yapamaz yani, bazen bc.Token boş. Eğer ilgilenirseniz kullandığım çözüm için düzenlemeye bakın –