2014-04-24 7 views
7

मैं वीएस2013 एसपीए टेम्पलेट के उदाहरण का पालन कर रहा हूं - हालांकि बेयरर टोकन्स का उपयोग नहीं कर रहा हूं (शायद यह समस्या है लेकिन यदि संभव हो तो यह कुकीज़ के साथ काम करना चाहती है)।एएसपी.नेट एमवीसी 5 ओविन: क्यों उपयोगकर्ता.इडेन्टिटी.आईएस प्रमाणीकृत == फेसबुक के माध्यम से साइन इन करने के बाद गलत?

यहाँ एक मेरी एपीआई नियंत्रक में प्रासंगिक कार्रवाई विधि के संस्करण में कटौती कर रहा है:

[HttpGet] 
    [AllowAnonymous] 
    public async Task<IHttpActionResult> ExternalLogin(string provider, string error = null) 
    { 

     if (!User.Identity.IsAuthenticated) 
     { 
      return new ChallengeResult(provider, this); 
     } 

     ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity); 

     // ...do stuff with externalLogin data 
    } 

यहाँ अनुरोधों के बुनियादी प्रवाह है:

  1. उपयोगकर्ता क्लिक करता है फेसबुक बटन, भेजता है करने के लिए मिल/api/externallogin? प्रदाता = फेसबुक

  2. उपयोगकर्ता.इडेन्टिटी.आईएस प्रमाणीकृत रिटर्न झूठी -> 401 में परिणाम लौटाए जा रहे हैं और मिडलवेयर 302 में परिवर्तित हो गया है > 'Redirect_uri को कोई कॉल करने से ब्राउज़र में परिणाम -' स्थान 'शीर्षक के साथ फेसबुक लॉगइन पेज के लिए सेट

  3. ब्राउज़र फेसबुक के माध्यम में फेसबुक प्रवेश पृष्ठ पर (https://www.facebook.com/dialog/oauth?response_type=code&client_id={myClientId}&redirect_uri=http%3A%2F%2Flocalhost%3A54819%2Fsignin-facebook&scope=user_birthday&state={someStateCode})

  4. उपयोगकर्ता संकेत चला जाता है 'लेकिन अब क्वेरी स्ट्रिंग में' कोड 'और' स्टेट 'पैरामीटर के साथ http://localhost:54819/signin-facebook?code={someCode}&state={someStateCode}

  5. ' redirect_uri 'पर कॉल से प्रतिक्रिया 302 है, स्थान शीर्षलेख मेरे एप्लिकेशन पर वापस सेट है और इसमें दो' सेट- कुकी 'हेडर:

    • स्थान: http://localhost:54819/api/en-gb/account/externallogin?provider=Facebook
    • सेट-कुकी: .AspNet.Correlation.Facebook =; = गुरु, 01 जनवरी 1970 00:00:00 GMT समाप्त हो रहा है
    • सेट कुकी: .AspNet.ExternalCookie = Rv01CHd2onYtN_MHw2Bt71JSaOP71uRk7AP6kSilnAg7djXMh5fbZxlRCPuZhy8inhEF7ChNB261WVU3LGDuIaQmMXgz7tqXeNI-ji8qQFi2d64a720PbRVpWnkuHm2m8L87fkJAGQMJOku5gMrc0EZJfKNgjXiLv-c6Vo7PEzNch-CqcCPFHP0KBo7tGhDTbgJt-RvTzkkB1NL2JBc23eiaeda70oAW4P0NfIyj_i9mLUexHXz8Qooy9CBoLrN7Z198H_cawBfiMMF0tK1YFee2eH_TQxdmdKkUFVRz58EeIKyKUEEDswbQA9evPEHpD8BIlJPXi6R2scC44_INufXuKjHOt7LW3-sPRkUGbEWCWOn4d1B4FkHR_xOHtRpGpIdZU14xJLLiyFYKR0XxJiRlRIph8KKYnZHy61wMOl2yznOFqq3rzHOGhZ1xXEKmUlByiawPbNpdS9pNZVSHlGMbiz0FsOTf4_EVAKEXRQyxEbYjBBXD_5Ne6f7SpBqE; पथ = /; केवल Http
  6. ब्राउज़र तो चरण 5 (वापस अपने आवेदन करने के लिए) से स्थान शीर्षक में यूआरएल के लिए अनुरोध प्राप्त भेजता है, तो निम्न कुकी के साथ (ऊपर 'सेट-कुकी' के निर्देश के अनुसार):

    • कुकी: .AspNet.ExternalCookie = Rv01CHd2onYtN_MHw2Bt71JSaOP71uRk7AP6kSilnAg7djXMh5fbZxlRCPuZhy8inhEF7ChNB261WVU3LGDuIaQmMXgz7tqXeNI-ji8qQFi2d64a720PbRVpWnkuHm2m8L87fkJAGQMJOku5gMrc0EZJfKNgjXiLv-c6Vo7PEzNch-CqcCPFHP0KBo7tGhDTbgJt-RvTzkkB1NL2JBc23eiaeda70oAW4P0NfIyj_i9mLUexHXz8Qooy9CBoLrN7Z198H_cawBfiMMF0tK1YFee2eH_TQxdmdKkUFVRz58EeIKyKUEEDswbQA9evPEHpD8BIlJPXi6R2scC44_INufXuKjHOt7LW3-sPRkUGbEWCWOn4d1B4FkHR_xOHtRpGpIdZU14xJLLiyFYKR0XxJiR lRIph8KKYnZHy61wMOl2yznOFqq3rzHOGhZ1xXEKmUlByiawPbNpdS9pNZVSHlGMbiz0FsOTf4_EVAKEXRQyxEbYjBBXD_5Ne6f7SpBqE
  7. समस्या: User.Identity।IsAuthenticated जांच इस स्तर पर झूठी देता है (वास्तव में उपयोगकर्ता क्षेत्र मूल रूप से रिक्त है)

मैं सोचा, कि AspNet.ExternalCookie निश्चित रूप से चरण 6 पर अनुरोध में भेजा जा रहा है दिया जाएगा तो उपयोगकर्ता जिससे है प्रमाणीकृत।

तो, क्या किसी को यह पता है कि इस चरण में मिडलवेयर क्या खोज रहा है ताकि इसे कुकी को डीकोड/डिक्रिप्ट/डी-सीरियलाइज करने और उपयोगकर्ता को संतृप्त करने के लिए ???

यहाँ Startup.Auth मेरे पास है:

public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      //AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      AuthenticationType = Constants.AuthenticationTypes.MchAdminApplicationCookie, 
      SlidingExpiration = true, 
      ExpireTimeSpan = new TimeSpan(10, 0, 0) 
     }); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      //AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      AuthenticationType = Constants.AuthenticationTypes.MchApiApplicationCookie, 
      SlidingExpiration = true, 
      ExpireTimeSpan = new TimeSpan(10, 0, 0) 
     }); 

     var facebook = new FacebookAuthenticationOptions 
     { 
      AppId = "mycode", 
      AppSecret = "mysecret", 

      AuthenticationType = "Facebook", 
      SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie, 
      Provider = new FacebookAuthenticationProvider 
      { 
       OnAuthenticated = async ctx => 
       { 
        if (ctx.User["birthday"] != null) 
        { 
         ctx.Identity.AddClaim(new Claim(ClaimTypes.DateOfBirth, ctx.User["birthday"].ToString())); 
        } 
       } 
      } 
     }; 
     facebook.Scope.Add("user_birthday"); 
     app.UseFacebookAuthentication(facebook); 
    } 
+0

क्या आपको इस जेटेक का उत्तर मिला? मेरी भी यही समस्या है। – spadelives

उत्तर

0

मैं एक ही समस्या का सामना करना पड़ा। आपको बाहरी गुणों में दो विशेषताओं को जोड़ना चाहिए:

[OverrideAuthentication] 
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)] 
संबंधित मुद्दे