authentication - विंडोज सक्रिय निर्देशिका प्रमाणीकरण और पहचान आधारित दावों का उपयोग कैसे करें?




asp.net-identity claims-based-identity (4)

अपने डीबी के खिलाफ प्रमाणीकरण के बजाय बस उपयोगकर्ता नाम और पासवर्ड के साथ एडी दबाएं

// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        var user = await UserManager.FindByNameAsync(model.UserName);
        if (user != null && AuthenticateAD(model.UserName, model.Password))
        {
            await SignInAsync(user, model.RememberMe);
            return RedirectToLocal(returnUrl);
        }
        else
        {
            ModelState.AddModelError("", "Invalid username or password.");
        }
    }
    return View(model);
}

public bool AuthenticateAD(string username, string password)
{
    using(var context = new PrincipalContext(ContextType.Domain, "MYDOMAIN"))
    {
        return context.ValidateCredentials(username, password);
    }
}

मुसीबत

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

जहां तक ​​मुझे पता है, एडी और पहचान आधारित दावों से शादी करने का कोई आसान तरीका नहीं है।

लक्ष्य

  • स्थानीय सक्रिय निर्देशिका वाले उपयोगकर्ताओं को प्रमाणित करें
  • दावों का प्रबंधन करने के लिए पहचान ढांचे का उपयोग करें

प्रयास (विफल)

  • विंडोज़। ओविन। सुरक्षा। सक्रिय डायरेक्टरी - दोह। यह Azure एडी के लिए है। कोई एलडीएपी समर्थन नहीं। क्या वे इसे AzureActiveDirectory के बजाय बुला सकते हैं?
  • विंडोज प्रमाणीकरण - यह एनटीएलएम या केबरोस प्रमाणीकरण के साथ ठीक है। समस्याएं शुरू होती हैं: i) टोकन और दावे सभी एडी द्वारा प्रबंधित किए जाते हैं और मैं यह नहीं समझ सकता कि इसके साथ पहचान दावों का उपयोग कैसे किया जाए।
  • एलडीएपी - लेकिन ऐसा लगता है कि पहचान दावों का उपयोग करने के लिए मैन्युअल रूप से फॉर्म प्रमाणीकरण करने के लिए मुझे मजबूर करना पड़ रहा है? निश्चित रूप से एक आसान तरीका होना चाहिए?

किसी भी मदद की सराहना की तुलना में अधिक होगा। मैं इस समस्या पर काफी समय से अटक गया हूं और इस मामले पर बाहरी इनपुट की सराहना करता हूं।


आप दावे ट्रान्सफॉर्मेशन का उपयोग कर सकते हैं, मैंने अभी इस लेख को नीचे दिए गए लेख और कोड का उपयोग करके काम किया है। मैं विंडो प्रमाणीकरण के साथ एक एप्लिकेशन तक पहुंच रहा हूं और फिर SQL डेटाबेस में संग्रहीत अनुमतियों के आधार पर दावा जोड़ रहा हूं। यह एक अच्छा लेख है जो आपकी मदद कर सकता है।

https://github.com/aspnet/Security/issues/863

संक्षेप में ...

services.AddScoped<IClaimsTransformer, ClaimsTransformer>();

app.UseClaimsTransformation(async (context) =>
{
IClaimsTransformer transformer = context.Context.RequestServices.GetRequiredService<IClaimsTransformer>();
return await transformer.TransformAsync(context);
});

public class ClaimsTransformer : IClaimsTransformer
    {
        private readonly DbContext _context;

        public ClaimsTransformer(DbContext dbContext)
        {
            _context = dbContext;
        }
        public async Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
        {

            System.Security.Principal.WindowsIdentity windowsIdentity = null;

            foreach (var i in context.Principal.Identities)
            {
                //windows token
                if (i.GetType() == typeof(System.Security.Principal.WindowsIdentity))
                {
                    windowsIdentity = (System.Security.Principal.WindowsIdentity)i;
                }
            }

            if (windowsIdentity != null)
            {
                //find user in database by username
                var username = windowsIdentity.Name.Remove(0, 6);
                var appUser = _context.User.FirstOrDefault(m => m.Username == username);

                if (appUser != null)
                {

                    ((ClaimsIdentity)context.Principal.Identity).AddClaim(new Claim("Id", Convert.ToString(appUser.Id)));

                    /*//add all claims from security profile
                    foreach (var p in appUser.Id)
                    {
                        ((ClaimsIdentity)context.Principal.Identity).AddClaim(new Claim(p.Permission, "true"));
                    }*/

                }

            }
            return await System.Threading.Tasks.Task.FromResult(context.Principal);
        }
    }

एएसपीएनईटी 5 (बीटा 6) पर, विचार कुकी प्रमाणीकरण और पहचान का उपयोग करना है: आपको अपनी स्टार्टअप क्लास में जोड़ना होगा:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddAuthorization();
    services.AddIdentity<MyUser, MyRole>()
        .AddUserStore<MyUserStore<MyUser>>()
        .AddRoleStore<MyRoleStore<MyRole>>()
        .AddUserManager<MyUserManager>()
        .AddDefaultTokenProviders();
}

कॉन्फ़िगरेशन सेक्शन में, जोड़ें:

private void ConfigureAuth(IApplicationBuilder app)
{
    // Use Microsoft.AspNet.Identity & Cookie authentication
    app.UseIdentity();
    app.UseCookieAuthentication(options =>
    {
        options.AutomaticAuthentication = true;
        options.LoginPath = new PathString("/App/Login");
    });
}

फिर, आपको इसे लागू करने की आवश्यकता होगी:

Microsoft.AspNet.Identity.IUserStore
Microsoft.AspNet.Identity.IRoleStore
Microsoft.AspNet.Identity.IUserClaimsPrincipalFactory

और विस्तार / ओवरराइड:

Microsoft.AspNet.Identity.UserManager
Microsoft.AspNet.Identity.SignInManager

मैंने वास्तव में एक नमूना प्रोजेक्ट स्थापित किया है यह दिखाने के लिए कि यह कैसे किया जा सकता है। गिटहब लिंक

मैंने beta8 पर परीक्षण किया और कुछ छोटे अनुकूलन (जैसे Context => HttpContext) के साथ यह भी काम किया।


क्या आप जानते हैं कि कस्टम System.Web.Security.MembershipProvider को कैसे कार्यान्वित करें। System.Web.Security.MembershipProvider ? आपको सक्रिय निर्देशिका के विरुद्ध प्रमाणित करने के लिए System.DirectoryServices.AccountManagement.PrincipalContext.ValidateCredentials() संयोजन के साथ इस (ओवरराइड ValidateUser ) का उपयोग करने में सक्षम होना चाहिए।

कोशिश करें: var pc = new PrincipalContext(ContextType.Domain, "example.com", "DC=example,DC=com"); pc.ValidateCredentials(username, password); var pc = new PrincipalContext(ContextType.Domain, "example.com", "DC=example,DC=com"); pc.ValidateCredentials(username, password);





visual-studio-2015