2015-09-30 6 views
5

मैं भी Azure अनुप्रयोग सेवा मोबाइल ऐप बैकएंड का उपयोग करता है उपयोगकर्ता के OneDrive खाते के रूप में एक यूनिवर्सल विंडोज प्लेटफार्म (UWP) एप्लिकेशन बनाने रहा अनुप्रयोग सेवा मोबाइल ऐप एसएसओ सक्षम करने के लिए। मैं प्रमाणीकरण के लिए 2 आवश्यकताओं है:कैसे UWP

  1. उपयोगकर्ता किसी Microsoft खाते (जैसे विंडोज 10) के साथ उनकी UWP डिवाइस में लॉग इन किया है, तो मैं नहीं चाहता कि उन्हें (एक लॉगिन संकेत प्रस्तुत किया अर्थात् एकल साइन ऑन, अपने माइक्रोसॉफ्ट अकाउंट क्रेडेंशियल्स का दोबारा उपयोग कर रहे हैं)।
  2. मैं, Azure & OneDrive में एक ही प्रमाणीकरण घटना करना चाहते हैं अर्थात उपयोगकर्ता एक बार अधिकृत करता है और मैं फिर से उपयोग कि दोनों सेवाओं के लिए टोकन।

मैं लाइव एसडीके के साथ प्रवेश और फिर MobileServiceClient.LoginAsync() विधि को लौट टोकन गुजर, हालांकि मैं इस एक Azure साथ UWP में काम करने के लिए नहीं मिल सकता है द्वारा एक Azure मोबाइल सेवा के साथ Windows Phone 8 में ऐसा किया मोबाइल एप्लिकेशन। जब मैं उसी विधि को कॉल करता हूं तो मुझे 401 Unauthorised प्रतिक्रिया प्राप्त होती है।

  • मैं दुकान के साथ मेरी UWP एप्लिकेशन जुड़े और माइक्रोसॉफ्ट खाता डेवलपर केंद्र पर आवेदन की स्थापना की, Azure मोबाइल एप्लिकेशन से रीडायरेक्ट यूआरआई जोड़ना भी शामिल है।
  • मैं Azure अनुप्रयोग सेवा मोबाइल ऐप की स्थापना की है, माइक्रोसॉफ्ट खाता डेवलपर केंद्र से ग्राहक आईडी & गुप्त जोड़ने शामिल है।
  • मैं टोकन प्राप्त करने कई तरीके, OnlineIdAuthenticator, WebAuthenticationCoreManager और WebAuthenticationBroker सहित कोशिश की है। अब तक कोई भी काम नहीं कर पाया है।

मैं वर्तमान में एक वर्ग LiveAuthenticationService में निम्न कोड का उपयोग एक पहुँच टोकन प्राप्त करने:

public async Task<bool> LoginAsync() 
{ 
    AccessToken = null; 
    bool success = false; 
    OnlineIdAuthenticator onlineIdAuthenticator = new OnlineIdAuthenticator(); 
    EventWaitHandle waithandle = new ManualResetEvent(false); 

    OnlineIdServiceTicketRequest serviceTicketRequest = new OnlineIdServiceTicketRequest(scopes, "DELEGATION"); 
    UserIdentity result = await onlineIdAuthenticator.AuthenticateUserAsync(serviceTicketRequest); 
    if (!string.IsNullOrWhiteSpace(result?.Tickets[0]?.Value)) 
    { 
     currentUserId = result.SafeCustomerId; 
     AccessToken = result.Tickets[0].Value; 
     success = true; 
     waithandle.Set(); 
    } 
    else 
    { 
     await logger.LogErrorAsync("Error signing in to Microsoft Live", 
            new Dictionary<string, string> { { "errorCode", result?.Tickets[0]?.ErrorCode.ToString() } }); 
    } 
    waithandle.WaitOne(10000); //10 second timeout 

    return success; 
} 

और फिर यह है कि टोकन, जो ऊपर से LiveAuthenticationService का उपयोग करता है के साथ अपने Azure मोबाइल एप्लिकेशन के लिए लॉग इन करने के लिए प्रयास करने के लिए :

private async Task RefreshUserIdAndAccessToken() 
{ 
    try 
    { 
     var tcs = new TaskCompletionSource<MobileServiceUser>(); 

     var authService = new LiveAuthenticationService(); 
     await UiDispatcher.RunAsync(CoreDispatcherPriority.Normal, 
            async() => 
            { 
             try 
             { 
              await authService.LoginAsync(); 
              var jsonAuthenticationToken = JObject.Parse(@"{""authenticationToken"": """ + authService.AccessToken + @"""}"); 
              tcs.SetResult(await mobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount, jsonAuthenticationToken)); 
             } 
             catch (Exception ex) 
             { 
              tcs.SetException(ex); 
             } 
            }); 

     var user = await tcs.Task; 
     currentUserId = user.UserId; 
     AccessToken = user.MobileServiceAuthenticationToken; 
    } 
    catch (Exception ex) 
    { 
     await logger.LogExceptionAsync(ex, 
             Constants.LOGGING_DATAKEY_REFRESHACCESSTOKENFAILURE, 
             currentUserId); 
     currentUserId = null; 
     AccessToken = null; 
    } 
} 

जैसा कि यह परिणाम Azure से 401 अनधिकृत प्रतिक्रिया में बताया गया है। मैंने फिडलर चलाया है और अनुरोध सही प्रतीत होता है, अनुरोध के साथ जेएसओएन पेलोड में अपेक्षित प्रमाणीकरण टोकन शामिल है।

अद्यतन एक बात मैं देख सकते हैं कि टोकन ऊपर कोड द्वारा जारी किए गए, लगभग 900 वर्ण लंबा है प्रपत्र YnElFkAAcK8bRSQab/FK+PT5n/wA4CPU... में सभी, जबकि टोकन जारी किए गए है कि अगर मैं Azure मोबाइल ऐप प्रमाणीकरण, यानी कॉल संभालने दें है MobileServiceClient.LoginAsync() टोकन पास किए बिना, केवल 350 वर्ण लंबा है और hbGciOi.eyJmdWWxsIiwiRGJn... रूप में (शुरुआत की अवधि को नोटिस करें)।

यह समस्या वास्तव में मुझे अब समस्याओं के कारण किया गया है। मैं प्रमाणीकरण के बिना ऐप को रिलीज़ नहीं कर सकता हूं और मैं इसे ठीक करने का तरीका नहीं समझ सकता। किसी भी तरह की सहायता को आभार समझेंगे।

उत्तर

4

यह मैं हल करने के लिए के रूप में मैं इस समस्या को भी सामना करना पड़ रहा था के लिए एक कठिन एक था।

सबसे महत्वपूर्ण हिस्सा OnlineIdServiceTicketRequest अनुरोध इस तरह दिखना चाहिए है:

var mobileServicesTicket = new OnlineIdServiceTicketRequest("https://yourmobileservice.azure-mobile.net/", "JWT"); 

ध्यान दें कि हम अपने अंत बिंदु को निर्दिष्ट कर रहे हैं और यह भी प्रतिनिधिमंडल के एक जेडब्ल्यूटी का अनुरोध टोकन बजाय। यह 350ish वर्ण टोकन मिलेगा जिसे आप ढूंढ रहे थे।

यहाँ मैं क्या कर रहा हूं की एक पूरी कोड नमूना है:

public async Task<bool> LoginAsync() 
{ 
    var authenticator = new Windows.Security.Authentication.OnlineId.OnlineIdAuthenticator(); 
    var mobileServicesTicket = new Windows.Security.Authentication.OnlineId.OnlineIdServiceTicketRequest("https://yourendpoint.azure-mobile.net/", "JWT"); 

    var ticketRequests = new List<OnlineIdServiceTicketRequest>() { mobileServicesTicket }; 

    var authResult = await authenticator.AuthenticateUserAsync(ticketRequests, CredentialPromptType.PromptIfNeeded); 

    if ((authResult.Tickets.Count == 1) && (authResult.Tickets[0].ErrorCode == 0)) 
    {        
     var accessToken = authResult.Tickets[0];   
     var res = await _mobileServiceClient.LoginWithMicrosoftAccountAsync(accessToken.Value); 

     return true; 
    } 
    else 
    {   
    return false; 
    } 
} 

_mobileServiceClient वर्ग में इंजेक्ट किया जाता है और WindowsAzure.MobileServices पुस्तकालय के भीतर Microsoft.WindowsAzure.MobileServices.MobileServiceClient वस्तु के लिए एक संदर्भ है।

मैं वास्तव में इस समस्या को यहाँ http://jshapland.com/single-sign-on-with-azure-mobile-services-in-a-uwp-app/

+0

आप क्या nuget पैकेज का उपयोग किया था के बारे में एक ब्लॉग लेख लिखने के समाप्त हो गया? आपके द्वारा प्रदान किए गए कोड में आप स्थानीय चर _mobileServiceClient का संदर्भ दे रहे हैं। क्या यह 'WindowsAzure.MobileServices' nuget से या 'Microsoft.Azure.Mobile.Client' nuget से है? – emseetea

+0

मैंने अपना उत्तर अपडेट किया जहां से यह संदर्भ आया था। यह WindowsAzure.MobileServices nuget पैकेज है। – jmshapland

+0

हम्म। आप LoginAsync का आह्वान कैसे करते हैं? जब मैं डिबगिंग कर रहा हूं, तो यह "प्रामाणिकता। प्रमाणीकरण यूज़र एसिंक" लाइन पर स्टाल करता है ... मुझे एक अपवाद मिल रहा है जो कहता है "प्रमाणीकरण लक्ष्य अमान्य है या सही तरीके से कॉन्फ़िगर नहीं किया गया है।" – emseetea

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