2016-10-27 23 views
6

का उपयोग करके भूमिका-आधारित प्राधिकरण को कार्यान्वित करना मैं अपने वेब एप्लिकेशन में भूमिका-आधारित प्राधिकरण को कार्यान्वित करना चाहता हूं जिसे मैं बना रहा हूं। जिस तरह से मैं यह सुनिश्चित करने के लिए कल्पना की निम्नलिखित की तरह मेरे डीबी में 3 टेबल बनाने के लिए है: प्रत्येक उपयोगकर्ता एक भूमिका उसे सौंपी होता.NET MVC 5

1. Roles 
2. UserRoles (many to many table) 
3. Users 

उसके बाद। अब ... मेरा सवाल है, मैं अपने .NET MVC एप्लिकेशन के अंदर विशिष्ट दृश्य/नियंत्रकों तक पहुंच को कैसे अनुमति या प्रतिबंधित कर सकता हूं। मैं इस पर ठोकर खाई है:

[Authorize(Roles = "HrAdmin, CanEnterPayroll")] 
[HttpPost] 
public ActionResult EnterPayroll(string id) 
{ 
    // . . . Enter some payroll . . . 
} 

अधिकृत संपत्ति विशिष्ट भूमिकाओं के लिए विशिष्ट नियंत्रक/कार्रवाई सीमित किया जा रहा है ... लेकिन क्या होगा अगर मैं मेरे मामले में की तरह तालिका UserRoles से उपयोगकर्ता भूमिकाओं को पढ़ ?? मेरे एप्लिकेशन को यह पता चल जाएगा कि उपयोगकर्ता के पास सिस्टम पर कौन सी भूमिका है ??

क्या कोई इस से मेरी सहायता कर सकता है?

+0

क्या आपने [एएसपी.नेट पहचान] (https://www.asp.net/identity) की जांच की थी? – SeM

+0

आपको अपनी 'लॉगिन()' विधि में अपनी भूमिकाओं के साथ दावा जोड़ना होगा। – SeM

+0

उपरोक्त पहले से ही एमवीसी 5 में निर्मित पहचान ढांचे में लागू किया गया है। आपको इन तालिकाओं को स्वयं बनाने के बारे में चिंता करने की आवश्यकता नहीं है, बस डिफ़ॉल्ट कनेक्शन स्ट्रिंग में संशोधन करें और इसे सर्वर पर इंगित करें। – uk2k05

उत्तर

7

नाटक आप में अपने यूज़रनेम और भूमिकाओं को संग्रहीत किया है की सुविधा देता है इस कोर पर है का उल्लेख सत्र:

[AllowAnonymous] 
[HttpGet] 
public ActionResult Login() 
{ 
    . . . . 

    string userName = (string)Session["UserName"]; 
    string[] userRoles = (string[])Session["UserRoles"]; 

    ClaimsIdentity identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie); 

    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userName)); 

    userRoles.ToList().ForEach((role) => identity.AddClaim(new Claim(ClaimTypes.Role, role))); 

    identity.AddClaim(new Claim(ClaimTypes.Name, userName)); 

    AuthenticationManager.SignIn(identity); 

    . . . . 
} 
+0

मदद कर सकता है उत्कृष्ट उदाहरण, बहुत बहुत धन्यवाद !! :) – User987

+0

आपका स्वागत है :) – SeM

+0

मैंने अभी इस विधि को आजमाया है, लेकिन यह कहता है कि प्रमाणीकरण प्रबंधक श्रेणी में किसी कारण से साइनइन विधि नहीं है:/ – User987

1

यदि आप नियंत्रक (कक्षा स्तर पर) या एक क्रिया (फ़ंक्शन स्तर) तक पहुंचने के लिए भूमिका निभाते हैं तो उनकी भूमिकाओं तक पहुंच होगी। अन्यथा पहुंच अस्वीकार कर दी गई है।

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

पूरी तरह से उम्मीद है कि मैं इसे स्पष्ट कर रहा हूं?

दावों आधारित पहचान का उपयोग करने के लिए निम्न

https://msdn.microsoft.com/en-gb/library/ee517291.aspx

https://msdn.microsoft.com/en-gb/library/ff359101.aspx

What is the claims in ASP .NET Identity

+0

हाँ मैं आपको समझता हूं। यहां मुद्दा यह है कि, मैं अपने डीबी से भूमिका कैसे जोड़ूं ताकि एप्लिकेशन जानता हो कि उपयोगकर्ता डीबी से किस भूमिका में है। @ एसईएम ने कहा कि मैं इसे "दावा" नामक कुछ के साथ कर सकता हूं ... क्या यह सही तरीका है? – User987

+0

हां दावा करने का एक तरीका है, मैंने कुछ लिंक के साथ अपना repose संशोधित किया है जो आपको – Emil

0

यहां कोड के कुछ टुकड़े हैं जो आप Azure Active Directory का उपयोग करके प्राप्त कर सकते हैं। Startup.cs में आवेदन का विन्यास:

[Authorize(Roles = "SuperAdmin, Worker")] 
public ActionResult Index() 
{ 
    ViewBag.Message = "Hello"; 
    return View(); 
} 

और:

public ActionResult Submit(FormCollection formCollection) 
{ 
    if (User.IsInRole("SuperAdmin") || User.IsInRole("Worker")) 
    { 
     ... 
    } 

    if (User.IsInRole("Admin")) 
    { 
     //do some admin tasks 
    } 

    return RedirectToAction("Index", "Tasks"); 
} 

यहाँ उस पर अपने ब्लॉग पोस्ट है: http://www.eidias.com/blog/2016/1/16/using-azure-active-directory-application-roles

public void ConfigureApplication(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    ... 

    app.UseIISPlatformHandler(); 
    app.UseStaticFiles(); 

    app.UseCookieAuthentication(options => 
    { 
     options.AutomaticAuthenticate = true; 
    });    

    app.UseOpenIdConnectAuthentication(options => 
    { 
     options.AutomaticChallenge = true; 
     options.ClientId = Configuration.Get<string>("Authentication:AzureAd:ClientId"); 
     options.Authority = Configuration.Get<string>("Authentication:AzureAd:AADInstance") + "Common"; 
     options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; 

     options.TokenValidationParameters = new TokenValidationParameters 
     { 
      ValidateIssuer = false, 
      RoleClaimType = "roles" 
     }; 
     options.Events = new OpenIdConnectEvents 
     { 
      OnAuthenticationValidated = (context) => Task.FromResult(0), 
      OnAuthenticationFailed = (context) => 
      { 
       context.Response.Redirect("/Home/Error"); 
       context.HandleResponse(); // Suppress the exception 
       return Task.FromResult(0); 
      }, 
      OnRemoteError = (context) => Task.FromResult(0) 
     }; 
    }); 

    app.UseMvc(routes => 
    { 
     routes.MapRoute(name: "default", template: "{controller=Dashboard}/{action=Index}/{id?}");     
    }); 

    DatabaseInitializer.InitializaDatabaseAsync(app.ApplicationServices).Wait(); 
} 

और यहाँ उपयोग है। आप एएडी में उपरोक्त भूमिकाओं को कॉन्फ़िगर कैसे कर सकते हैं।

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