मेरे पास एक एमवीसी 6 प्रोजेक्ट (vNext) है और मैं एएसपी.NET पहचान के साथ खेल रहा हूं। मेरे मामले में मैं बिल्ड-इन सामान का उपयोग नहीं करना चाहता जो ईएफ (साइनइनमेनर, उपयोगकर्ता प्रबंधक, उपयोगकर्तास्टोर) का उपयोग करता है। मेरे पास एक बाहरी डेटाबेस है और मैं सिर्फ उपयोगकर्ता नाम/पासवर्ड लुकअप बनाना चाहता हूं और एक वैध कुकी वापस कराना चाहता हूं। इसलिए मैंने अपनी कक्षाएं लिखना शुरू कर दिया।एएसपी.नेट 5 पहचान - कस्टम साइनइन प्रबंधक
public class MyUser
{
public string Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string PasswordHash { get; set; }
}
public class MyUserStore : IUserStore<MyUser>, IUserPasswordStore<MyUser>
{
...
}
MyUserStore
कक्षा में मैं अपने स्टोर के रूप में (केवल परीक्षण प्रयोजनों के लिए) उपयोगकर्ताओं की हार्ड-कोडेड सूची का उपयोग कर रहा हूँ। और मैं हार्ड-कोडेड स्टोर से डेटा वापस करने के लिए कुछ विधियों को ओवरराइड करता हूं।
public class MyUserManager : UserManager<MyUser>
{
public MyUserManager(
IUserStore<MyUser> store,
IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<MyUser> passwordHasher,
IEnumerable<IUserValidator<MyUser>> userValidators,
IEnumerable<IPasswordValidator<MyUser>> passwordValidators,
ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors,
IEnumerable<IUserTokenProvider<MyUser>> tokenProviders,
ILoggerFactory logger,
IHttpContextAccessor contextAccessor) :
base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, tokenProviders, logger, contextAccessor)
{
}
}
यहाँ मैं तरीकों CheckPasswordAsync
और VerifyPasswordAsync
क्रमशः true
और PasswordVerificationResult.Success
वापस जाने के लिए सिर्फ परीक्षा के लिए बनाया है। इस प्रकार
public class MyClaimsPrincipleFactory : IUserClaimsPrincipalFactory<MyUser>
{
public Task<ClaimsPrincipal> CreateAsync(MyUser user)
{
return Task.Factory.StartNew(() =>
{
var identity = new ClaimsIdentity();
identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
var principle = new ClaimsPrincipal(identity);
return principle;
});
}
}
public class MySignInManager : SignInManager<MyUser>
{
public MySignInManager(MyUserManager userManager, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory<MyUser> claimsFactory, IOptions<IdentityOptions> optionsAccessor = null, ILoggerFactory logger = null)
: base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger)
{
}
public override Task<SignInResult> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
// here goes the external username and password look up
if (userName.ToLower() == "username" && password.ToLower() == "password")
{
return base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout);
}
else
{
return Task.FromResult(SignInResult.Failed);
}
}
}
और सब कुछ Startup
कक्षा में झुका है:
services.AddIdentity<MyUser, MyRole>()
.AddUserStore<MyUserStore>()
.AddUserManager<MyUserManager>()
.AddDefaultTokenProviders();
और क्योंकि मैं यह डि में जोड़ने के लिए Startup
कोड में MySignInManager
वस्तु बनाने के लिए प्रबंधन नहीं किया (नियंत्रकों और विचारों में बाद में इंजेक्शन के लिए), मैं इसे MyAccountController
में बना रहा हूं।
public MyAccountController(IHttpContextAccessor httpContextAccessor, UserManager<MyUser> userManager, IOptions<IdentityOptions> optionsAccessor, ILoggerFactory logger)
{
SignInManager = new MySignInManager(userManager as MyUserManager, httpContextAccessor, new MyClaimsPrincipleFactory(), optionsAccessor, logger);
}
MyAccount
नियंत्रक में मेरी MyLogin
कार्रवाई में मैं PasswordSignInAsync
बोल रहा हूँ और मैं देख सकता हूँ कि मैं इसे में एन्कोड दावे के साथ कुकी (MyClaimsPrincipleFactory
से) हो रही है। जब मैं AuthorizeAttribute
पर कुछ अन्य क्रियाओं को कॉल करने का प्रयास करता हूं तो मैं देख सकता हूं कि कुकी अनुरोध हेडर में है लेकिन मैं अनधिकृत हूं (अधिक सटीक, क्योंकि मैंने अंतर्निहित डिफ़ॉल्ट एएसपी.NET पहचान प्रमाणीकरण को नहीं हटाया है दृश्य स्टूडियो नमूना टेम्पलेट, मुझे इसके बजाय खाता/लॉगिन पर रीडायरेक्ट किया गया है)।
क्या यह एएसपी.नेट पहचान को अनुकूलित करने का सही तरीका है और मैं यहां क्या खो रहा हूं?
इस लाइन वापसी आधार पर एक ब्रेकपॉइंट रखें। पासवर्ड साइनइनएसिंक (उपयोगकर्ता नाम, पासवर्ड, isPersistent, shouldLockout); और देखें कि यह क्या लौटाता है। मेरा अनुमान है कि यह भी SignInResult लौट रहा है। विफल। मैं बेस क्लास को कॉल करने के बजाय टास्क.फ्रोआरसल्ट (साइनइन रिसेट। सिक्योर) वापस कर दूंगा ... एचएच – ojf
हाँ मैंने कोशिश की। जब मैं बेस विधि को कॉल किए बिना सफलता वापस कर रहा हूं, तो मुझे कुकी नहीं मिल रही है। –