2017-01-26 17 views
5

में उपयोगकर्ता कुकी टिकट को रीफ्रेश करें ASP.NET कोर वेब एप्लिकेशन में नियंत्रक में मैं उपयोगकर्ता को रीफ्रेश करना चाहता हूं और क्लाइंट पर संग्रहीत कुकी टिकट में दावा करना चाहता हूं।एएसपी.Net कोर पहचान

ग्राहक प्रमाणीकृत और अधिकृत है, एएसपी.नेट कोर पहचान कुकी जानकारी में इस जानकारी को स्टोर करता है - अब कुछ नियंत्रक कार्यों में मैं कुकी में डेटा रीफ्रेश करना चाहता हूं।

SignInManager में RefreshSignInAsync रीफ्रेश करने के लिए एक फ़ंक्शन है, लेकिन यह HttpContext.User पैरामीटर के रूप में स्वीकार नहीं करता है।

[HttpPost("[action]")] 
[Authorize] 
public async Task<IActionResult> Validate() 
{ 
    // todo: update the Client Cookie 
    await _signInManager.RefreshSignInAsync(User); // wrong type 
} 

मैं कुकी को रीफ्रेश कैसे करूं?

+0

ठीक है, 'HttpContext.User' में एक प्रिंसिपल ('दावा प्रिंसिपल' है, जिसमें पहचान और दावों)। SignInManager 'TUser' लेता है जो उपयोगकर्ता प्रकार पर निर्भर करता है जिसका उपयोग आप पहचान को कॉन्फ़िगर करने के लिए करते थे। टोकन से उपयोगकर्ता आईडी प्राप्त करें उपयोगकर्ता को प्राप्त करें और इसे रीफ्रेश करें। या तो एक्शन फ़िल्टर या एक्सटेंशन विधि या दोनों – Tseng

उत्तर

7
public static class HttpContextExtenssions 
{ 
    public static async Task RefreshLoginAsync(this HttpContext context) 
    { 
     if (context.User == null) 
      return; 

     // The example uses base class, IdentityUser, yours may be called 
     // ApplicationUser if you have added any extra fields to the model 
     var userManager = context.RequestServices 
      .GetRequiredService<UserManager<IdentityUser>>(); 
     var signInManager = context.RequestServices 
      .GetRequiredService<SignInManager<IdentityUser>>(); 

     IdentityUser user = await userManager.GetUserAsync(context.User); 

     if(signInManager.IsSignedIn(context.User)) 
     { 
      await signInManager.RefreshSignInAsync(user); 
     } 
    } 
} 

फिर एक कार्य फिल्टर

public class RefreshLoginAttribute : ActionFilterAttribute 
{ 
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) 
    { 
     await context.HttpContext.RefreshLoginAsync(); 

     await next(); 
    } 
} 

में अपने नियंत्रक

[HttpPost("[action]")] 
[Authorize] 
public async Task<IActionResult> Validate() 
{ 
    await HttpContext.RefreshLoginAsync(); 
} 

या यह सार में इसका इस्तेमाल करते हैं तो आपके नियंत्रक में इस तरह इसका इस्तेमाल

[HttpPost("[action]")] 
[Authorize] 
[RefreshLogin] // or simpler [Authorize, RefreshLogin] 
public async Task<IActionResult> Validate() 
{ 
    // your normal controller code 
} 
+0

नाइस के रूप में समझा जा सकता है - एक बात, userManager.GetUserAsync इसके बजाय IdentityUser टाइप नहीं करता है लेकिन इसके बजाय एक IdentityRoleEntity, जिसे पैराश्री के रूप में RefreshSignInAsync के साथ उपयोग नहीं किया जा सकता है। – Sam

+0

'IdentityRoleEntity' कहां से आता है? यह पहचान का हिस्सा नहीं प्रतीत होता है। क्या यह आपकी कक्षा 'पहचान' से ली गई है? मैं पूछता हूं क्योंकि UserManager उस पर जेनेरिक पैरामीटर का उत्तर है, उपयोगकर्ता मॉडल, यानी 'उपयोगकर्ता प्रबंधक <पहचानकर्ता>' डिफ़ॉल्ट कॉन्फ़िगरेशन में या 'UserManager ' या जो भी आपने अपनी कक्षा को नामित किया है, जब आप इसे अपने क्षेत्र में बढ़ाते हैं । – Tseng

+0

आह, हाँ - मैंने आपके उदाहरण कोड 'var userManager = context.RequestServices का उपयोग किया है। GETRequiredService >();' पहचान प्रकार 'को अपनी इकाई प्रकार के साथ बदले बिना। मुझे 'var userManager = context.RequestServices का उपयोग करने की आवश्यकता है। GETRequiredService >(); 'इसके बजाय। – Sam

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