मैं ASP.NET कोर 2.0 में एक से अधिक auth स्कीम कैसे सेटअप करूं?



asp.net-mvc asp.net-core (1)

इन परिवर्तनों को नेविगेट करना मुश्किल हो गया है, लेकिन मुझे लगता है कि मैं कर रहा हूँ अनुमान लगा रहा हूँ। AddScheme गलत है।

AddScheme उपयोग न करें: यह एक कम-स्तरीय विधि है जो हैंडलर लेखकों के लिए डिज़ाइन किया गया है।

मैं ASP.NET कोर 2.0 में एक से अधिक auth स्कीम कैसे सेटअप करूं?

कुकीज़ हैंडलर को पंजीकृत करने के लिए, बस करें:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(options =>
        {
            options.DefaultScheme = "myauth1";
        })

       .AddCookie("myauth1");
       .AddCookie("myauth2");
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseAuthentication();

        // ...
    }
}

यह नोट करना महत्वपूर्ण है कि आप कई डिफ़ॉल्ट योजनाओं को पंजीकृत नहीं कर सकते हैं जैसे कि आप 1.x में कर सकते हैं (इस विशाल रिफैक्टरिंग की पूरी स्थिति एक ही समय में कई स्वचालित प्रमाणीकरण मिडलवेयर होने से बचने के लिए है)।

यदि आपको 2.0 में इस व्यवहार का अनुकरण करने की ज़रूरत है, तो आप एक कस्टम मिडलवेयर लिख सकते हैं जो मैन्युअल रूप से AuthenticateAsync() कॉल करता है और ClaimsPrincipal करता है कि ClaimsPrincipal जिसमें आपकी सभी आवश्यक पहचान है

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(options =>
        {
            options.DefaultScheme = "myauth1";
        })

       .AddCookie("myauth1");
       .AddCookie("myauth2");
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseAuthentication();

        app.Use(async (context, next) =>
        {
            var principal = new ClaimsPrincipal();

            var result1 = await context.AuthenticateAsync("myauth1");
            if (result1?.Principal != null)
            {
                principal.AddIdentities(result1.Principal.Identities);
            }

            var result2 = await context.AuthenticateAsync("myauth2");
            if (result2?.Principal != null)
            {
                principal.AddIdentities(result2.Principal.Identities);
            }

            context.User = principal;

            await next();
        });

        // ...
    }
}

मैं अपने auth सामान को कोर 2.0 में माइग्रेट करने की कोशिश कर रहा हूं और अपनी स्वयं की प्रमाणीकरण योजना का उपयोग करते हुए कोई समस्या आ रही है। स्टार्टअप में मेरी सेवा सेटअप इस तरह दिखती है:

var authenticationBuilder = services.AddAuthentication(options =>
{
    options.AddScheme("myauth", builder =>
    {
        builder.HandlerType = typeof(CookieAuthenticationHandler);
    });
})
    .AddCookie();

नियंत्रक में मेरा लॉगिन कोड इस प्रकार दिखता है:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Name)
};

var props = new AuthenticationProperties
{
    IsPersistent = persistCookie,
    ExpiresUtc = DateTime.UtcNow.AddYears(1)
};

var id = new ClaimsIdentity(claims);
await HttpContext.SignInAsync("myauth", new ClaimsPrincipal(id), props);

लेकिन जब मैं एक नियंत्रक या एक्शन फ़िल्टर में हूं, मेरे पास केवल एक पहचान है, और यह प्रमाणित नहीं है:

var identity = context.HttpContext.User.Identities.SingleOrDefault(x => x.AuthenticationType == "myauth");

इन परिवर्तनों को नेविगेट करना मुश्किल हो गया है, लेकिन मुझे लगता है कि मैं कर रहा हूँ अनुमान लगा रहा हूँ। AddScheme गलत है। कोई सुझाव?

संपादित करें: यहां (अनिवार्य रूप से) एक साफ ऐप है जो उपयोगकर्ता के पहचान के दो सेटों में न हो।

namespace WebApplication1.Controllers
{
    public class Testy : Controller
    {
        public IActionResult Index()
        {
            var i = HttpContext.User.Identities;
            return Content("index");
        }

        public async Task<IActionResult> In1()
        {
            var claims = new List<Claim> { new Claim(ClaimTypes.Name, "In1 name") };
            var props = new AuthenticationProperties  { IsPersistent = true, ExpiresUtc = DateTime.UtcNow.AddYears(1) };
            var id = new ClaimsIdentity(claims);
            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(id), props);
            return Content("In1");
        }

        public async Task<IActionResult> In2()
        {
            var claims = new List<Claim> { new Claim(ClaimTypes.Name, "a2 name") };
            var props = new AuthenticationProperties { IsPersistent = true, ExpiresUtc = DateTime.UtcNow.AddYears(1) };
            var id = new ClaimsIdentity(claims);
            await HttpContext.SignInAsync("a2", new ClaimsPrincipal(id), props);
            return Content("In2");
        }

        public async Task<IActionResult> Out1()
        {
            await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            return Content("Out1");
        }

        public async Task<IActionResult> Out2()
        {
            await HttpContext.SignOutAsync("a2");
            return Content("Out2");
        }
    }
}

और स्टार्टअप:

namespace WebApplication1
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication(options =>
            {
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                })
                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie("a2");

            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseAuthentication();

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




asp.net-core-2.0