2016-01-22 11 views
6

के लिए "UserId नहीं मिला" अपवाद देता है मैं JWT के साथ पहचान और भूमिका आधारित दावों के निर्माण के बारे में bitoftech tutorial के साथ अनुसरण कर रहा हूं। मेरा आवेदन उपयोगकर्ता int PK के साथ एक कस्टम उपयोगकर्ता तालिका है।CreateUserIdenityAsync कस्टम पहचान उपयोगकर्ता

वर्तमान में, GenerateUserIdentityAsync विधि बस एक अजीब UserId not found त्रुटि देता है।

ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, "JWT"); 

और User इकाई में कार्यान्वयन: यहाँ मेरी कोड है अजीब तरह से पर्याप्त,,

public class AppUserManager : UserManager<User, int> 

जब मैं डिबग उदाहरण this:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User, int> manager, string authenticationType) 
{ 
    //error on this line: CreateIdentityAsync throws error 
    var userIdentity = await manager.CreateIdentityAsync(this, authenticationType); 
    return userIdentity; 
} 

मेरे UserManager वर्ग इतना की तरह परिभाषित किया गया है GenerateIdentityAsync में UserId संपत्ति है, लेकिन बेस में केवल id है और मुझे आश्चर्य है कि यह कहां है ई यह त्रुटि हो रही है? (यह सही नहीं लगता है)

मैं source code (लाइन 80) देख रहा था लेकिन मुझे यह पता नहीं लगाया जा सकता कि अपवाद कहाँ फेंक दिया जा रहा है।

सटीक अपवाद उत्पन्न किया जा रहा है: कि उपयोगी

UserId not found. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: 
    System.InvalidOperationException: 
    UserId not found. 

और stack trace है नहीं सब (मेरे लिए)

मुझे कैसे पता चलेगा कि क्यों/जहां उपयोगकर्ता पहचान उपलब्ध नहीं है?


मोड विवरण:

मेरे GrantResourceOwnerCredentials():

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
    context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] {"*"}); 

    var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 
    User user = await userManager.FindAsync(context.UserName, context.Password); 

    if (user == null) // this is NOT null 
    { 
     context.SetError("invalid_grant", "The username or password is incorrect"); 
     return; 
    } 

    // this line fails 
    ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, "JWT"); 
    var ticket = new AuthenticationTicket(oAuthIdentity, null); 
    context.Validated(ticket); 
} 

और ApplicationUser आप को पता चला के रूप में

public partial class User : IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim> 
{ 
    public int UserId { get; set; } 
    public string Fullname { get; set; } 
    public string Address { get; set; } 
    public string ContactNumber { get; set; } 
} 
+0

यदि आपके पास सही कॉलम नाम हैं (आईडी के बजाय UserId या इसके विपरीत) आपके एस्पनेट डीबी में सत्यापित करें। कॉलम टाइप मिस्चैच की एक संभावना भी है (अन्वेषणकर्ताओं के रूप में nvarchar (256))। – Batuta

उत्तर

3

(जो, मेरे मामले में, बस User है)डीबगिंग करते समयमें Id है जो आपके मामले में उपयोगकर्ता के आईडी का प्रतिनिधित्व करेगा।

आप अपने User वर्ग से UserId हटाने की जरूरत, IdentityUser से आधार Id का उपयोग करें और Id अपने कस्टम उपयोगकर्ता तालिका में UserId स्तंभ नाम बदलें।

आपके User कक्षा में आपके पास मौजूद किसी भी गुण डेटाबेस में आपकी उपयोगकर्ता तालिका में मिलान करने वाला कॉलम भी होना चाहिए। यदि नहीं तो आपको उन गुणों के लिए एक ही त्रुटि मिल जाएगी जो मेल नहीं खाते हैं।

यही मतलब होगा Fullname, Address और ContactNumberAspNetUsers तालिका में स्तंभ नाम से मेल खाता है देना होगा अन्यथा आप के साथ-साथ उन गुणों के लिए एक ही त्रुटि मिल जाएगा।

+0

हाय, इन परिवर्तनों में मेरा परिवर्तन किया, लेकिन अभी भी एक ही त्रुटि को मार रहा है; अब मैं सवाल कर रहा हूं कि 'UserId' जो मुझे लगता है वह है, कोई आंतरिक अपवाद नहीं है, केवल स्टैक ट्रेस है लेकिन दुर्भाग्य से यह बहुत मदद नहीं है। उपर्युक्त आपका कोड उपयोगकर्ता को दो बार खींचता है, जो काम करने में कोई समस्या नहीं है, मैं बाद में रिफैक्टर कर सकता हूं, लेकिन यह अभी भी सटीक उसी अपवाद को फेंक रहा है – LocustHorde

+0

@LocustHorde, मैं वापस ड्राइंग बोर्ड पर गया और आपकी समस्या को दोबारा जांच लिया। आपके द्वारा प्रदान की गई अतिरिक्त जानकारी का उपयोग करके मैं आंतरिक अपवाद सहित, उसी अपवाद को फिर से बनाने में सक्षम था। 'UserId' को 'AspNetUsers' तालिका में एक वैध कॉलम होना चाहिए। मुझे लगता है कि पिछली टिप्पणीकर्ता ने भी यह संकेत दिया था। – Nkosi

+0

बढ़िया! आपकी टिप्पणी के बाद मैंने देखा कि तालिका में दो 'उपयोगकर्ता आईडी' के साथ-साथ 'आईडी' कॉलम थे, और मेरी बीज विधि में मैं केवल 'UserId' populating था, और 'आईडी' शून्य था।जब मैंने लॉगिन करने का प्रयास किया, तो किसी भी कारण से 'UserId' फेंकने वाली विधि नहीं मिली है। एक बार जब मैंने शून्य को मैन्युअल रूप से एक पूर्णांक में बदल दिया, तो यह ठीक काम करना शुरू कर दिया! तो मुझे लगता है कि मुझे 'आईडी' को हटाना है और किसी भी तरह से' UserId' का उपयोग करने के लिए पहचान बताएं ... – LocustHorde

2

आपका एप्लिकेशन यूज़र क्लास कैसा दिखता है? यह विधि आपके आवेदन में कैसी दिखती है?

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context){} 

GrantResourceOwnerCredentials के बारे में Taiseer की टिप्पणी कर रहे हैं:

"हम उपयोगकर्ता द्वारा प्रवेश, इस पहचान सभी भूमिकाओं और प्रमाणीकृत उपयोगकर्ता के दावों में शामिल होंगे के लिए एक पहचान बना रहे हैं"

मुझे इसी तरह के मुद्दे को हल करने के लिए दावों को अस्वीकार करने के लिए दावों को अस्वीकार करना था। - IdIdentityUser से विरासत में मिली है

ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); 

if (user == null) 
{ 
    context.SetError("invalid_grant", "The user name or password is incorrect."); 
    return; 
} 

var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())); 
+0

हाय, ऊपर कोड कोड दोनों जोड़ा; आप जेडब्ल्यूटी का उपयोग नहीं कर रहे हैं? – LocustHorde

+0

मैंने इसे 'DefaultAuthenticationTypes.AplicationCookie' और अभी भी वही त्रुटि के साथ करने की कोशिश की, मुझे लगता है कि मैं कम से कम – LocustHorde

+0

सही के साथ जेडब्ल्यूटी को हस्तक्षेप कर सकता हूं, सही है, मैं जेडब्ल्यूटी का उपयोग नहीं कर रहा था। – BBauer42

2

आप अपने User कक्षा में दोनों UserId और Id गुण होते हैं: यहाँ मेरी GrantResourceOwnerCredentials विधि का महत्वपूर्ण हिस्सा है। समस्या यह है कि User के लिए प्राथमिक कुंजी होने के लिए आपने शायद UserId कॉन्फ़िगर किया है।

आपको प्राप्त अपवाद ClaimsIdentityFactory.CreateAsync विधि में line 97UserManager.GetSecurityStampAsync पर फेंक दिया गया है। जैसा कि आप देख सकते हैं, user.Id सुरक्षा टिकट को पुनर्प्राप्त करने के लिए उपयोग किया जाता है।

आप UserManager.GetSecurityStampAsync अंदर देखो, तो आपको लगता है कि अपवाद आपको मिल बिल्कुल यहां फेंक दिया है देखेंगे:

public virtual async Task<string> GetSecurityStampAsync(TKey userId) 
{ 
    ThrowIfDisposed(); 
    var securityStore = GetSecurityStore(); 
    var user = await FindByIdAsync(userId).WithCurrentCulture(); 
    if (user == null) 
    { 
     throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.UserIdNotFound, 
      userId)); 
    } 
    return await securityStore.GetSecurityStampAsync(user).WithCurrentCulture(); 
} 

इस प्रकार, User वर्ग से UserId संपत्ति को हटाने और Id (IdentityUser से विरासत में मिली) के बजाय का उपयोग शुरू।

2

मुझे एक ही समस्या का सामना करना पड़ा। सिर दर्द के बाद मैं असली समस्या को हल कर सकता हूं। जब आप उपयोगकर्ता वर्ग की आईडी प्रॉपर्टी के डेटा प्रकार को स्ट्रिंग करने के लिए बदलते हैं, तो एक GUID()। ToString() को कन्स्ट्रक्टर में आईडी प्रॉपर्टी में असाइन किया जाता है और उसी मान को डेटाबेस में सहेजा जाता है और पहचान उस उपयोगकर्ता का विवरण पुनर्प्राप्त करती है मूल्य।

हालांकि, यदि आपने आईडी प्रॉपर्टी के डेटा प्रकार को int में बदल दिया है और उस प्रॉपर्टी के लिए उस प्रॉपर्टी के लिए कोई मूल्य प्रदान नहीं किया है, तो पहचान अभी भी डिफ़ॉल्ट int मान (0) का उपयोग कर उपयोगकर्ता विवरण पुनर्प्राप्त करने का प्रयास करती है। कारण संदेश को फेंक देता है "System.InvalidOperationException: UserId नहीं मिला"।

मैंने इसे कमांड द्वारा डेटाबेस से मूल्य पुनर्प्राप्त करके हल किया। निष्पादन Scalar() और उपयोगकर्ता को मान असाइन करें। आईडी। आशा है कि यह किसी को भी इसी तरह की समस्या का सामना करने में मदद करेगा।

+0

हाय @vkuttyp, आप किस कन्स्ट्रक्टर के बारे में बात कर रहे हैं? धन्यवाद। – chemitaxis

+0

क्या आप थोड़ा और विवरण साझा कर सकते हैं? आपने वास्तव में उस उपयोगकर्ता को कहाँ सेट किया था। आईडी? धन्यवाद –

+0

हाय @chemitaxis, मैंने जो कन्स्ट्रक्टर का उल्लेख किया वह पहचान यूज़र क्लास कन्स्ट्रक्टर है। – vkuttyp

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