MVC 5 एक्सेस दावा पहचान उपयोगकर्ता डेटा


119

मैं एंटिटी फ्रेमवर्क 5 डाटाबेस फर्स्ट एप्रोच का उपयोग करके एक एमवीसी 5 वेब एप्लिकेशन विकसित कर रहा हूं । मैं उपयोगकर्ताओं के प्रमाणीकरण के लिए OWIN का उपयोग कर रहा हूं । नीचे मेरे खाता नियंत्रक के भीतर मेरा लॉगिन तरीका दिखाया गया है।

public ActionResult Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        var user = _AccountService.VerifyPassword(model.UserName, model.Password, false);
        if (user != null)
        {
            var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);

            identity.AddClaim(new Claim(ClaimTypes.Role, "guest"));
            identity.AddClaim(new Claim(ClaimTypes.GivenName, "A Person"));
            identity.AddClaim(new Claim(ClaimTypes.Sid, user.userID)); //OK to store userID here?

            AuthenticationManager.SignIn(new AuthenticationProperties
            {
                IsPersistent = model.RememberMe
            }, identity);

            return RedirectToAction("Index", "MyDashboard");
        }
        else
        {
            ModelState.AddModelError("", "Invalid username or password.");
        }
    }
    // If we got this far, something failed, redisplay form
    return View(model);
}

जैसा कि आप देख सकते हैं कि मैं एक ClaimsIdentity बना रहा हूं और इसमें कई दावे जोड़ रहा हूं , फिर साइन इन करने के लिए AuthenticationManager का उपयोग करके इसे OWIN के पास भेज रहा हूं

मेरे पास जो समस्या है वह यह है कि मुझे यकीन नहीं है कि मेरे आवेदन के बाकी हिस्सों में दावों को कैसे नियंत्रित किया जाए, या तो नियंत्रकों में या रेजर व्यूज में।

मैंने इस ट्यूटोरियल में सूचीबद्ध दृष्टिकोण की कोशिश की थी

http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/

उदाहरण के लिए, मैंने अपने नियंत्रक कोड में यह दावा करने के लिए कि मानों को पारित करने के लिए उपयोग करने का प्रयास किया है, हालांकि, उपयोगकर्ता। जालिम अशक्त के बराबर है

var ctx = HttpContext.GetOwinContext();
ClaimsPrincipal user = ctx.Authentication.User;
IEnumerable<Claim> claims = user.Claims;

शायद मुझे यहाँ कुछ याद आ रहा है।

अपडेट करें

डारिन के जवाब के आधार पर, मैंने उसका कोड जोड़ा, लेकिन फिर भी मैं क्लेम की पहुंच देखने में विफल रहा। कृपया नीचे स्क्रीनशॉट देखें जो मैं देख रहा हूँ जब पहचान पर मँडरा गया।

यहां छवि विवरण दर्ज करें


क्या आप पुष्टि कर सकते हैं कि कुकी ब्राउज़र द्वारा वापस भेजी गई है? शायद आपकी सुरक्षा सेटिंग्स एसएसएल की मांग करती हैं?
कम

@leastprivilege धन्यवाद, मैं अब उस पर गौर करूंगा। मैंने Stackoverflow, stackoverflow.com/questions/20319118/… पर यह प्रश्न पाया, यह वही समस्या है जो मुझे हो रही है, लेकिन दुर्भाग्य से इसका कोई जवाब नहीं है :(
tcode

आपके OWIN घटकों को कैसे आरंभ किया जाता है?
डेरेक वान क्यूक

मुझे हाल ही में इस तरह की समस्या थी; मुझे उम्मीद है कि यह समाधान मदद करता है: stackoverflow.com/questions/34537475/…
अलेक्जेंड्रू

जवाबों:


172

इसे इस्तेमाल करे:

[Authorize]
public ActionResult SomeAction()
{
    var identity = (ClaimsIdentity)User.Identity;
    IEnumerable<Claim> claims = identity.Claims;
    ...
}

आपकी सहायता के लिए धन्यवाद। मैंने क्लेम के मानों को प्राप्त करने और उन तक पहुंचने के लिए एक नियंत्रक के भीतर एक एक्शन में आपके सुझाए गए उत्तर का उपयोग किया है, हालांकि, मैं पहचानता हूं। कैलेम्स अभी भी NULL है (स्क्रीनशॉट के साथ अद्यतन प्रश्न देखें)। कोई अन्य विचार? तुम्हारी सहायता सराहनीय है।
tcode

नहीं, क्षमा करें, मेरे पास अन्य विचार नहीं हैं। इसने हमेशा मेरे लिए काम किया है।
डारिन दिमित्रोव

क्षमा करें, एक अंतिम प्रश्न। क्या मुझे अपना स्वयं का कस्टम क्लेम करने की आवश्यकता हैआगुलेंटिकेशन मैनजर वर्ग और Application_PostAuthenticateRequest () Global.asax में इस तरह की dotnetcodr.com/2013/02/25/… से पहले मेरा कोड ऊपर काम करेगा? एक बार फिर धन्यवाद।
टोड

7
जब तक आप पहली बार अधिकृत करते हैं, तब तक आपके पास लॉगिन विधि के बाद तक इस तक पहुंच नहीं होती है, यही वजह है कि ओपी उस समय इसे नहीं देखता है। यदि आप इसे लॉगिन विधि में चाहते हैं तो आपको इस समय मैन्युअल रूप से लोड करना होगा।
एडम टलीपर - एमएसएफटी

मैं asp.net कोर के साथ काम कर रहा हूं और 2 घंटे से अधिक के दौरान लिंक्डइन प्रोफाइल पिक्चर प्राप्त करने का तरीका ढूंढ रहा हूं। मैं फंस गया हूं, मैं थक गया हूं, मैं तब तक हार चाहता हूं जब तक कि मैं आपका जवाब नहीं देख लेता। मैं लाख बार धन्यवाद कहना चाहता हूं ... +1
वायु

36

आप यह भी कर सकते हैं:

//Get the current claims principal
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
var claims = identity.Claims;

अपडेट करें

टिप्पणियों के अनुसार आगे स्पष्टीकरण प्रदान करने के लिए।

यदि आप अपने सिस्टम में उपयोगकर्ता इस प्रकार बना रहे हैं:

UserManager<applicationuser> userManager = new UserManager<applicationuser>(new UserStore<applicationuser>(new SecurityContext()));
ClaimsIdentity identity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);

आपके पास पहचान से संबंधित कुछ दावे स्वचालित रूप से होने चाहिए।

उपयोगकर्ता द्वारा प्रमाणित दावों को जोड़ने के बाद आप इसे निम्नानुसार कर सकते हैं:

var user = userManager.Find(userName, password);
identity.AddClaim(new Claim(ClaimTypes.Email, user.Email));

दावों को वापस पढ़ा जा सकता है क्योंकि डारिन ने ऊपर या मेरे पास जैसा उत्तर दिया है।

जब आप पहचान से नीचे जाने का दावा करते हैं तो दावे कायम रहते हैं:

AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = persistCookie }, identity);

धन्यवाद, लेकिन फिर भी यह मेरे लिए काम नहीं करता है। क्या आप मेरा अद्यतन प्रश्न देख सकते हैं? साथ ही, एक आखिरी सवाल। क्या मुझे अपना स्वयं का कस्टम क्लेम करने की आवश्यकता हैआगुलेंटिकेशन मैनजर वर्ग और Application_PostAuthenticateRequest () Global.asax में इस तरह की dotnetcodr.com/2013/02/25/… से पहले मेरा कोड ऊपर काम करेगा? आपकी सहायता के लिए एक बार फिर से धन्यवाद।
टोड

नमस्ते, जब मैं एक पीसी पर वापस आऊंगा, तो मैं देखूंगा।
हचोनॉइड

धन्यवाद, वास्तव में इसकी सराहना करते हैं। एक स्टेज पर जहाँ यह मुझे
चोदने लगा है

@tgriffiths हाय, मैंने आपके लिए एक अपडेट जोड़ा है। उम्मीद है कि थोड़ा और जानकारी प्रदान कर रहा हूँ। सौभाग्य। :)
hutchonoid

दुर्भाग्य से मैं बिल्ट इन एंटिटी फ्रेमवर्क कोड फर्स्ट, उदाहरण के लिए, उपयोगकर्ता प्रबंधक आदि का उपयोग नहीं कर रहा हूँ, लेकिन आपके इनपुट के लिए धन्यवाद। चीयर्स।
21

30

मैं अपनी विस्तारित कक्षा को यह देखने के लिए बनाता हूं कि मुझे क्या चाहिए, इसलिए जब मुझे अपने नियंत्रक या मेरे दृश्य की आवश्यकता होती है, तो मैं केवल अपने नामस्थान का उपयोग कुछ इस तरह जोड़ता हूं:

public static class UserExtended
{
    public static string GetFullName(this IPrincipal user)
    {
        var claim = ((ClaimsIdentity)user.Identity).FindFirst(ClaimTypes.Name);
        return claim == null ? null : claim.Value;
    }
    public static string GetAddress(this IPrincipal user)
    {
        var claim = ((ClaimsIdentity)user.Identity).FindFirst(ClaimTypes.StreetAddress);
        return claim == null ? null : claim.Value;
    }
    public ....
    {
      .....
    }
}

मेरे नियंत्रक में:

using XXX.CodeHelpers.Extended;

var claimAddress = User.GetAddress();

मेरे रेजर में:

@using DinexWebSeller.CodeHelpers.Extended;

@User.GetFullName()

8
return claim?.Value;इसलिए नहीं कि क्यों
हाल्टर

17

यह एक विकल्प है यदि आप हर समय दावों का उपयोग नहीं करना चाहते हैं। बेन फोस्टर द्वारा इस ट्यूटोरियल पर एक नज़र डालें ।

public class AppUser : ClaimsPrincipal
{
    public AppUser(ClaimsPrincipal principal)
        : base(principal)
    {
    }

    public string Name
    {
        get
        {
            return this.FindFirst(ClaimTypes.Name).Value;
        } 
    }

}

फिर आप एक आधार नियंत्रक जोड़ सकते हैं।

public abstract class AppController : Controller
{       
    public AppUser CurrentUser
    {
        get
        {
            return new AppUser(this.User as ClaimsPrincipal);
        }
    }
}

नियंत्रक में, आप करेंगे:

public class HomeController : AppController
{
    public ActionResult Index()
    {
        ViewBag.Name = CurrentUser.Name;
        return View();
    }
}

12

डारिन के उत्तर पर और अधिक स्पर्श करने के लिए, आप FindFirst विधि का उपयोग करके अपने विशिष्ट दावों को प्राप्त कर सकते हैं :

var identity = (ClaimsIdentity)User.Identity;
var role = identity.FindFirst(ClaimTypes.Role).Value;

या यह भी एक स्ट्रिंग myValue = पहचान। FindFirstValue ("MyClaimType");
जुआन कार्लोस प्यूर्टो

यदि FindFirst "भूमिका" प्रकार के साथ कोई दावा नहीं करता है तो क्या होगा? अशक्त अपवाद?
फिल

10

आप यह भी कर सकते हैं।

IEnumerable<Claim> claims = ClaimsPrincipal.Current.Claims;

8

याद रखें कि IEnumerable को क्वेरी करने के लिए आपको system.linq का संदर्भ देना होगा।
यह आपको करने के लिए आवश्यक एक्सटेंशन ऑब्जेक्ट देगा:

CaimsList.FirstOrDefault(x=>x.Type =="variableName").toString();

7

@Rosdi Kasim'd का सबसे छोटा और सरलीकृत संस्करण है

string claimvalue = ((System.Security.Claims.ClaimsIdentity)User.Identity).
    FindFirst("claimname").Value;

Claimname क्या वह दावा है जिसे आप पुनः प्राप्त करना चाहते हैं अर्थात यदि आप "StreedAddress" दावे की तलाश कर रहे हैं तो उपरोक्त उत्तर इस प्रकार होगा

string claimvalue = ((System.Security.Claims.ClaimsIdentity)User.Identity).
    FindFirst("StreedAddress").Value;

उदाहरण प्रदान करते हुए "दावा" ने मेरा समय बचाया। धन्यवाद
नूर Lababidi

6
Request.GetOwinContext().Authentication.User.Claims

हालाँकि, "GenerateUserIdentityAsync" विधि के अंदर दावों को जोड़ना बेहतर है, खासकर यदि Startup.Auth.cs में regenerateIdentity सक्षम है।


GenerateUserIdentityAsyncएक भयानक सुझाव था, मैं पूरी तरह से इसके अनदेखा कर दिया। बहुत बहुत धन्यवाद तुलसी।
टाइममी ४ एस

2

कंट्रोलरबेस क्लास के अनुसार, आप कार्रवाई को अंजाम देने वाले उपयोगकर्ता के लिए दावे प्राप्त कर सकते हैं।

यहां छवि विवरण दर्ज करें

यहाँ आप इसे 1 पंक्ति में कैसे कर सकते हैं।

var claims = User.Claims.ToList();


0

मैंने अपने बेस कंट्रोलर में इसका इस्तेमाल किया। बस उपयोग के लिए तैयार करने के लिए साझा करना।

    public string GetCurrentUserEmail() {
        var identity = (ClaimsIdentity)User.Identity;
        IEnumerable<Claim> claims = identity.Claims;
        var email = claims.Where(c => c.Type == ClaimTypes.Email).ToList();
        return email[0].Value.ToString();
    }

    public string GetCurrentUserRole()
    {
        var identity = (ClaimsIdentity)User.Identity;
        IEnumerable<Claim> claims = identity.Claims;
        var role = claims.Where(c => c.Type == ClaimTypes.Role).ToList();
        return role[0].Value.ToString();
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.