2014-08-31 14 views
7

मुझे उम्मीद है कि कोई इस समस्या से मेरी मदद कर सकता है - यह मुझे पागल कर रहा है! :)एमवीसी 5 ओविन - बाहरी प्रमाणीकरण (QQ कनेक्ट) पर प्रमाणीकृत है

मैं QQ कनेक्ट (OAuth 2.0) के माध्यम से बाहरी लॉगिन का उपयोग करने के लिए tinysnake के QQ प्रदाता से कनेक्ट का उपयोग कर कोशिश कर रहा हूँ: https://github.com/tinysnake/microsoft-owin-security-qq

सब कुछ महान जा रहा किया जा रहा है - मैं अपने QQ खाते के माध्यम से प्रवेश कर सकते हैं और मैं उपयुक्त दावों आदि के साथ मेरी बाहरी लॉजिक कॉलबैक-विधि पर वापस पोस्ट किया गया मैं इन मानों का उपयोग IAuthenticationManager के माध्यम से उपयोगकर्ता पर हस्ताक्षर करने के लिए करता हूं - सब ठीक हो जाता है। हालांकि - जब मैं उपयोगकर्ता को किसी अन्य पृष्ठ पर रीडायरेक्ट करता हूं और चेक करता है कि वह लॉग इन है - तो मुझे ISA प्रमाणीकृत मान से एक गलत मान मिलता है ... और मैं पहले सेट किए गए किसी भी दाव को नहीं पढ़ सकता।

यह आसानी से ठीक कर सकता है - लेकिन मैं सिर्फ यह अभी नहीं देख सकते हैं :)

कुछ कोड:

authconfig:

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

    // Normal cookie sign in 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login"), 
     AuthenticationMode = AuthenticationMode.Active 
    }); 

    // QQ CONNECT 
    app.UseQQConnectAuthentication(
     appId: "XXXXXX", 
     appSecret: "XXXXXXXXXXXXXXXXX"); 
} 

AccountController:

// 
// POST: /Account/ExternalLogin 
[System.Web.Mvc.HttpPost] 
[System.Web.Mvc.AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult ExternalLogin(string provider, string returnUrl) 
{ 
    // Request a redirect to the external login provider 
    return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl })); 
} 

// 
// GET: /Account/ExternalLoginCallback 
[System.Web.Mvc.AllowAnonymous] 
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)] 
public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
{ 
    var ctx = Request.GetOwinContext(); 
    var result = ctx.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie).Result; 
    var claims = result.Identity.Claims.ToList(); 
    var name = claims.First(i => i.Type == "urn:qqconnect:name"); 

    claims.Add(new Claim(ClaimTypes.AuthenticationMethod, "QQ")); 
    claims.Add(new Claim(ClaimTypes.Name, name.Value)); 

    var ci = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ExternalCookie); 
    ctx.Authentication.SignIn(ci); 

    // DO OTHER STUFF HERE 

    return Redirect("~/"); 
} 

सभी अब तक अच्छी तरह से जा रहा है ... लगता है

HomeController:

public ActionResult Index() 
{ 
    var model = new HomeViewModel(); 

    var ctx = Request.GetOwinContext(); 
    if (ctx.Authentication.User.Identity.IsAuthenticated) // <-- THIS RETURNS FALSE 
    { 
     var claimsIdentity = User.Identity as ClaimsIdentity; 
     model.Name = claimsIdentity.FindFirst(ClaimTypes.Name).Value; 
     model.IsAuthenticated = true; 
    } 

    return View(model); 
} 

जब मैं ctx.Authentication.User.Identity.IsAuthenticated जाँच, मैं एक झूठी मूल्य मिलता है ... और मैं किसी भी दावे को पुनः प्राप्त नहीं कर सकता हूं।

क्या मुझे कुछ याद आ रही है?

किसी भी मदद की बहुत सराहना की जाएगी :)

अद्यतन

मैं अपने AccountController में ऐसा करने से काम कर रहे मेरे कोड है:

public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
{ 
    var ctx = Request.GetOwinContext(); 
    var result = ctx.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie).Result; 

    if (result.Identity.IsAuthenticated) 
    { 
     // Signed in successfully 
     var claims = result.Identity.Claims.ToList(); 
     var name = claims.First(i => i.Type == "urn:qqconnect:name"); 

     //claims.Add(new Claim(ClaimTypes.AuthenticationMethod, "QQ")); 
     claims.Add(new Claim(ClaimTypes.Name, name.Value)); 

     var id = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie); 
     var authenticationManager = ctx.Authentication; 
      authenticationManager.SignIn(id); 

    } 

    return Redirect("~/"); 
} 

लेकिन जिस तरह से मैं इसे देख - यहाँ मैं मैं एप्लिकेशनक्यूकी का उपयोग कर रहा हूं और साइन इन करने के लिए बाहरी कुकी नहीं ... या क्या मैं पूरी तरह से कुछ खो रहा हूं? यह समाधान मेरे लिए काम करता है - लेकिन मुझे यह जानना है कि यह करने का यह सही तरीका है या नहीं?

+1

इस के साथ समान समस्याएं होने पर, यदि कोई स्पष्टीकरण दे सकता है। – cchamberlain

उत्तर

1

मेरी समझ से, आप जो अनुभव कर रहे हैं, वह अपेक्षित है। अत्यंत oversimplifying:

  1. एप्लिकेशन बाहरी जानकारी हो जाता है और एक बाहरी कुकी
  2. बाहरी कुकी धारणा है कि यह सिर्फ एक अस्थायी कुकी कि देखने के लिए इस्तेमाल किया जाएगा से अपने ऐप्लिकेशन में भेज दिया जाता है बनाने के लिए इसे इस्तेमाल करता है उपयोगकर्ता के बारे में कोई अतिरिक्त स्थानीय जानकारी अप करें और उसके बाद स्थानीय [एप्लिकेशन] कुकी

कुछ और अधिक पूरी तरह से ब्रेकडाउन के लिए UseCookieAuthentication vs. UseExternalSignInCookie देखें।

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