asp.net - एमवीसी 5 एक्सेस दावा पहचान उपयोगकर्ता डेटा




asp.net-mvc authentication (8)

@ रोस्दी कासिम जवाब का सबसे छोटा और सरलीकृत संस्करण है

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

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

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

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

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);
}

जैसा कि आप देख सकते हैं कि मैं दावा कर रहा हूं और इसमें कई दावों को जोड़ रहा हूं, फिर साइन इन करने के लिए प्रमाणीकरण प्रबंधक का उपयोग करके इसे ओविन में पास कर रहा हूं

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

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

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;

शायद मैं यहाँ कुछ याद कर रहा हूँ।

अद्यतन करें

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


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

//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);

यह आलेख इस बारे में अधिक विस्तार से वर्णन करता है और एमवीसी 5 के लिए विशिष्ट है, अन्य लेख जो मुझे पता है, एमवीसी 4 के उद्देश्य से हैं।

http://kevin-junghans.blogspot.co.uk/2013/12/using-claims-in-aspnet-identity.html


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

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

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

यहां बताया गया है कि आप इसे 1 लाइन में कैसे कर सकते हैं।

var claims = User.Claims.ToList();

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

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()

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

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();
    }
}

Request.GetOwinContext().Authentication.User.Claims

हालांकि "GenerateUserIdentityAsync" विधि के अंदर दावों को जोड़ना बेहतर है, विशेष रूप से अगर Startup.Auth.cs में पुन: उत्पन्न करना सक्षम है।


var claim = User.Claims.FirstOrDefault(c => c.Type == "claim type here");




claims-based-identity