5

मुझे पहचान सर्वर 4 के दस्तावेज़ों के माध्यम से किया गया है और मैंने इसे लॉगिन प्रदाता के रूप में Microsoft Office 365 का उपयोग करने के लिए सेट अप किया है। उपयोगकर्ता में लॉग इन किया है जब मैं एक बटन है, जहां वह अपने ऐप्स को अपने कैलेंडर graph.microsoft.comएएसपी.नेट पहचान (पहचान सर्वर के साथ) बाहरी संसाधन ओथ एक्सेस टोकन

startup.cs में कोड की webhooks एपीआई का उपयोग कर की घटनाओं की सदस्यता के लिए अनुमति दे सकते हैं बनाना चाहते

app.UseMicrosoftAccountAuthentication(new MicrosoftAccountOptions 
{ 
    AuthenticationScheme = "Microsoft", 
    DisplayName = "Microsoft", 
    SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme, 

    ClientId = "CLIENT ID", 
    ClientSecret = "CLIENT SECRET", 
    CallbackPath = new PathString("/signin-microsoft"), 
    Events = new OAuthEvents 
    { 
     OnCreatingTicket = context => 
     { 
      redisCache.Set("AccessToken", context.AccessToken.GetBytes(), new DistributedCacheEntryOptions 
      { 
       AbsoluteExpiration = DateTimeOffset.UtcNow.AddDays(3) 
      }); 
      return Task.FromResult(context); 
     } 
    } 
    Scope = 
    { 
     "Calendars.Read", 
     "Calendars.Read.Shared", 
    }, 
    SaveTokens = true 
}); 

लेकिन यह स्पष्ट रूप से जाने के लिए एक व्यवहार्य मार्ग नहीं है। मैंने केवल परीक्षण उद्देश्यों के लिए और सब्सक्रिप्शन की पीओसी बनाने के लिए यह किया है।

अब मैं जानना चाहता हूं कि पहचान सर्वर के साथ संवाद करने का एक बेहतर तरीका है या नहीं, जो मुझे यह बाहरी एक्सेस टोकन प्राप्त करने की अनुमति देता है, ताकि मैं अपने लॉग इन उपयोगकर्ताओं की तरफ से माइक्रोसॉफ्ट एपीआई का उपयोग कर सकूं?

या माइक्रोसॉफ्ट एक्सेसटोकन को सीधे इस OAuthEvent से लेने का एकमात्र विकल्प है और लॉग इन उपयोगकर्ता से जुड़े डेटाबेस में सीधे इसे संग्रहीत करता है?

मुझे वास्तव में इसकी आवश्यकता है, क्योंकि मेरी अधिकांश कार्यक्षमता तीसरे पक्ष के डेटा पर आधारित है।

उत्तर

8

ठीक है, तो मुझे अंततः यह काम मिल गया। मैंने ASP.Net Identity और IdentityServer4 का उपयोग कर एक नई परियोजना बनाई है जो दोनों ASP.Net Core के शीर्ष पर बना है।

समस्या यह थी कि बाहरी प्रवाह प्रक्रिया में उपयोग किए जाने वाले प्रवाह के बारे में मुझे पूरी तरह से अवगत नहीं था।

आप दोनों प्रणालियों से बायलर प्लेटों का उपयोग करते हैं तो आप एक AccountController जहां निम्न विधि उपस्थित रहेंगे होगा:

await _signInManager.UpdateExternalAuthenticationTokensAsync(info);

यह:

// 
// GET: /Account/ExternalLoginCallback 
[HttpGet] 
[AllowAnonymous] 
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null) 
{ 
    if (remoteError != null) 
    { 
     ModelState.AddModelError(string.Empty, $"Error from external provider: {remoteError}"); 
     return View(nameof(Login)); 
    } 
    var info = await _signInManager.GetExternalLoginInfoAsync(); 
    if (info == null) 
    { 
     return RedirectToAction(nameof(Login)); 
    } 

    // Sign in the user with this external login provider if the user already has a login. 
    var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false); 
    if (result.Succeeded) 
    { 
     await _signInManager.UpdateExternalAuthenticationTokensAsync(info); 

     _logger.LogInformation(5, "User logged in with {Name} provider.", info.LoginProvider); 
     return RedirectToLocal(returnUrl); 
    } 
    if (result.RequiresTwoFactor) 
    { 
     return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl }); 
    } 
    if (result.IsLockedOut) 
    { 
     return View("Lockout"); 
    } 
    else 
    { 
     // If the user does not have an account, then ask the user to create an account. 
     ViewData["ReturnUrl"] = returnUrl; 
     ViewData["LoginProvider"] = info.LoginProvider; 
     var email = info.Principal.FindFirstValue(ClaimTypes.Email); 
     return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = email }); 
    } 
} 

यहाँ महत्वपूर्ण हिस्सा है आपके ASP.Net identity से जुड़े डेटाबेस तालिका में आपके बाहरी प्रमाण-पत्रों को सहेज लेगा। तालिका AspNetUserTokens में अब आपके पास 3 प्रविष्टियां होंगी, जिन्हें कुछ कहा जाता है: access_token, expires_at और token_type

ये टोकन है कि हम में रुचि रखते हैं कर रहे हैं, कि हम अपने आवेदन में कहीं और उन क्रेडेंशियल्स पहुँचने के लिए उपयोग कर सकते हैं।

के संदर्भ में इन टोकन लाने के लिए एक उपयोगकर्ता के लॉग इन:

var externalAccessToken = await _userManager.GetAuthenticationTokenAsync(User, "Microsoft", "access_token");

और एक उपयोगकर्ता हम डीबी से ला नहीं हम उपयोग कर सकते हैं के लिए उन्हें लाने के लिए:

var user = _userManager.Users.SingleOrDefault(x => x.Id == "myId"); 
if (user == null) 
    return; 

var claimsPrincipal = await _signInManager.CreateUserPrincipalAsync(user); 
var externalAccessToken = await _userManager.GetAuthenticationTokenAsync(claimsPrincipal, "Microsoft", "access_token"); 
+0

हाय क्रिस्टियन , क्या आप एक एएसपीनेट प्रोजेक्ट में सभी हिस्सों का उपयोग कर रहे हैं या पहचान सर्वर के लिए एक अलग अंतराल है? –

+0

@AmrElsehemy मैं एक अलग परियोजना में पहचान सर्वर की मेजबानी कर रहा हूं। हम माइक्रोस्कोप का उपयोग कर रहे हैं और हमारे अन्य एपीआई एक्सेस टोकन सत्यापन मिडलवेयर के माध्यम से पहचान सर्वर से संचार कर रहे हैं। उम्मीद है कि यह आपके प्रश्न का उत्तर देगा। –

+0

धन्यवाद, एक और सवाल, पहचान सर्वर एक ही अंतराल या बाहरी में होस्ट किया गया है, जो उपयोग करने के लिए बेहतर है? –

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