এমভিসি 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 এবং এটি বিভিন্ন দাবি যোগ করুন, তারপর তা ক্ষণস্থায়ী OWIN ব্যবহার AuthenticationManager সাইন ইন সম্পাদন করতে।

আমার যে সমস্যা হচ্ছে তা হ'ল আমি নিশ্চিত নই যে কীভাবে আমার বাকী অ্যাপ্লিকেশনগুলিতে কন্ট্রোলার বা রেজার ভিউজে দাবিগুলি অ্যাক্সেস করা যায়।

আমি এই টিউটোরিয়ালে তালিকাভুক্ত পদ্ধতির চেষ্টা করেছি

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;

সম্ভবত আমি এখানে কিছু মিস করছি।

হালনাগাদ

ডারিনের উত্তরের ভিত্তিতে, আমি তার কোডটি যুক্ত করেছি তবে এখনও আমি দাবিগুলিতে অ্যাক্সেস দেখতে ব্যর্থ হয়েছি। দয়া করে নীচে স্ক্রিনশটটি দেখান যা আমি যা দেখি তা পরিচয় দিয়ে দেখানো হয়েছে showing দাবিগুলি।

এখানে চিত্র বর্ণনা লিখুন


আপনি কি নিশ্চিত করতে পারেন যে কুকিটি ব্রাউজারের মাধ্যমে ফেরত পাঠানো হয়েছে? আপনার সুরক্ষা সেটিংস এসএসএল দাবি করতে পারে?
সর্বনিম্ন ব্যক্তিগত

@ সর্বনাশ ধন্যবাদ, আমি এখন এটি সন্ধান করব আমি 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;
    ...
}

আপনার সাহায্যের জন্য ধন্যবাদ. আমি দাবিগুলির মানগুলিকে অ্যাক্সেস করতে এবং অ্যাক্সেস করতে একটি নিয়ন্ত্রণকারীর মধ্যে থাকা একটি অ্যাকশনে আপনার প্রস্তাবিত উত্তরটি ব্যবহার করেছি, তবে আমি সনাক্ত করি la দাবিগুলি এখনও নাল (স্ক্রিনশট সহ আপডেট হওয়া প্রশ্নটি দেখুন)। অন্য কোন ধারণা? আমি তোমার সাহায্য কে সাধুবাদ জানাই.
tcode

না, দুঃখিত আমি অন্য ধারণা নেই। এটি সর্বদা আমার পক্ষে কাজ করেছে।
দারিন দিমিত্রভ

দুঃখিত, একটি শেষ প্রশ্ন। উপরের আমার কোডটি কাজ করার আগে গ্লোবাল.অ্যাসেক্সে আমার কি নিজস্ব কাস্টম দাবী প্রমাণীকরণ ব্যবস্থাপনার শ্রেণি এবং অ্যাপ্লিকেশন_পোস্টআউটিক্যান্টিক্যুয়েস্ট () তৈরি করার দরকার আছে ? আবার ধন্যবাদ.
tcode

7
আপনি প্রথমবার অনুমোদন না করা পর্যন্ত আপনার লগইন পদ্ধতির পরে অবধি এই অ্যাক্সেসটি পাবেন না যে কারণে ওপি সেই সময়ে এটি দেখতে পাবে না। আপনি যদি লগইন পদ্ধতিতে চান তবে আপনাকে এই মুহূর্তে ম্যানুয়ালি লোড করতে হবে।
অ্যাডাম টিউলিপার - এমএসএফটি

আমি এসপ নেট কোর নিয়ে কাজ করছি এবং ২ ঘন্টারও বেশি সময় ধরে লিঙ্কডইন প্রোফাইল ছবি পাওয়ার উপায় খুঁজছি। আমি আটকে আছি, আমি ক্লান্ত, আমি আপনার উত্তর না পাওয়া পর্যন্ত হাল ছেড়ে দিতে চাই। আমি
কয়েক

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

ধন্যবাদ, তবে তবুও এটি আমার পক্ষে কাজ করে না। আপনি আমার আপডেট করা প্রশ্ন দেখতে পারেন? এছাড়াও, একটি শেষ প্রশ্ন। উপরের আমার কোডটি কাজ করার আগে গ্লোবাল.অ্যাসেক্সে আমার কি নিজস্ব কাস্টম দাবী প্রমাণীকরণ ব্যবস্থাপনার শ্রেণি এবং অ্যাপ্লিকেশন_পোস্টআউটিক্যান্টিক্যুয়েস্ট () তৈরি করার দরকার আছে ? আপনার সাহায্যের জন্য আবার ধন্যবাদ।
tcode

হাই, আমি যখন পিসিতে ফিরে আসি তখন আমি একবার খেয়াল করব।
হ্যাচনয়েড

ধন্যবাদ, সত্যিই এটি প্রশংসা। এমন একটি পর্যায়ে যেখানে এটি আমাকে ক্র্যাক করতে শুরু করেছে :)
tcode

@ টাগ্রিফিথস হাই, আমি আপনার জন্য একটি আপডেট যুক্ত করেছি। আশাকরি আরও কিছু তথ্য সরবরাহ করছি। শুভকামনা। :)
হ্যাচোনয়েড

দুর্ভাগ্যক্রমে আমি প্রথমে বিল্ট ইন এনটিটি ফ্রেমওয়ার্ক কোডটি ব্যবহার করছি না, যেমন ইউজারম্যানেজার ইত্যাদি। তবে আপনার ইনপুটটির জন্য ধন্যবাদ for চিয়ার্স।
tcode

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;কারণ না কেন
Halter

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

দারিনের উত্তরের উপর আরও স্পর্শ করতে, আপনি ফাইন্ডফার্স পদ্ধতিটি ব্যবহার করে আপনার নির্দিষ্ট দাবী পেতে পারেন :

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

অথবা এটি আমার স্ট্রিং মাইভ্যালু = পরিচয়.ফাইন্ড ফার্স্টভ্যালু ("মাইক্লেইমটাইপ");
হুয়ান কার্লোস পুয়ের্তো

যদি ফাইন্ড ফার্স্ট "ভূমিকা" টাইপের সাথে কোনও দাবি না খুঁজে পায় তবে কী ঘটে? নাল ব্যতিক্রম?
ফিল

10

আপনি এটি করতে পারেন।

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

8

মনে রাখবেন যে আইনিউনামেবলের ক্যোয়ারী করার জন্য আপনাকে system.linq রেফারেন্স করতে হবে।
এটি আপনাকে প্রয়োজনীয় এক্সটেনশন অবজেক্টটি দেবে:

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

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

তবে "GenerateUserIdentityAsync" পদ্ধতির অভ্যন্তরে দাবিগুলি যুক্ত করা ভাল, বিশেষত যদি স্টার্টআপে পুনরায় জড়িত পরিচয়.অর্থ.সি.এস সক্ষম করা থাকে।


GenerateUserIdentityAsyncএকটি ভয়ঙ্কর পরামর্শ ছিল, আমি সম্পূর্ণই এটি overlooked হয়েছে। অনেক অনেক ধন্যবাদ বাসিল
টিমমি

6

@ রসদি কাসিমের উত্তরটির সংক্ষিপ্ততম ও সরলিকৃত সংস্করণ

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

Claimname আপনি যে দাবিটি পুনরুদ্ধার করতে চান তা হ'ল আপনি যদি "স্ট্রাইডএড্রেস" দাবিটি খুঁজছেন তবে উপরের উত্তরটি এর মতো হবে

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

উদাহরণ "দাবী" প্রদান করে আমার সময় সাশ্রয়। আপনাকে ধন্যবাদ
নূর লাব্বিদি

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();
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.