9

मैं एक एमवीसी वेब एप्लिकेशन बनाना चाहता हूं जो वेब एपीआई एप्लिकेशन से बात करता है और प्रमाणीकरण के लिए एडीएफएस 2.0 (विंडोज 2008 आर 2 पर) का उपयोग करता है।एडीएफएस 2.0 विंडोज 2008 आर 2 वेब एपीआई

मैं एमडीसी वेब एप्लिकेशन को एडीएफएस का उपयोग करके प्रमाणित करने में कामयाब रहा।

प्रश्न: लेकिन मुझे नहीं पता कि मुझे एमवीसी वेब से वेब एपीआई में अपने एडीएफएस 2.0 (विंडोज 2008 आर 2 पर) कैसे फेरेट करना चाहिए (मान लीजिए कि वे अलग-अलग सर्वरों में तैनात किए जाएंगे)?

Browser-ADFS 2.0-Web MVC-Backend Web API

मैं, कैसे WCF या विंडोज सर्वर 2012 R2, लेकिन नहीं वेब एपीआई और ADFS 2.0 Windows Server 2008 R2


संपादित में साथ साथ ऐसा करने पर लेख का एक बहुत कुछ पाया अंत में मैं poor man delegation के लिए गया (उसी बैकन को पास करना जो मुझे बैकएंड के सामने के अंत तक प्राप्त होता है (क्योंकि यह फिर से एडीएफ को कॉल करने के लिए समझ में नहीं आता है)

फ्रंटएंड -> गेटोकोकन कॉल करें और प्राधिकरण पर डालें हेडर (मैं इसे एन्कोड करता हूं बेस 64 के लिए)

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

उत्तर

1

मैं वाहक टोकन है कि मैं वेब API कॉल के प्राधिकरण हैडर में ADFS से प्राप्त पारित करके इस कार्यान्वित को मान्य, और उसके बाद वेब एपीआई प्रोजेक्ट में ओविन स्टार्टअप के दौरान httpcontext वर्तमान पहचान में टोकन का अनुवाद करने के लिए Microsoft.Owin.Security.Jwt nuget पैकेज का उपयोग करना।

यह उदाहरण भालू टोकन के रूप में एक jwt टोकन का उपयोग करता है। उस टोकन प्रकार के लिए उचित NuGet पैकेज चुनें जिसका आप उपयोग करना चाहते हैं।

वेब एपीआई पहले app.UseWebApi (config) लाइन में

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 फ़ाइल MVC नियंत्रक में WebRequest का निर्माण।

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

समस्या यह है कि आप जेडब्ल्यूटी टोकन भेजने के लिए ADFS 2008 R2 नहीं कर सकता है, और कभी कभी bc.Token रिक्त है। यदि आप रुचि रखते हैं तो मैंने जो समाधान इस्तेमाल किया है, उसके संपादन में देखें –

संबंधित मुद्दे