2017-10-25 50 views
6

के लिए कुकीज़ और बेयरर प्रमाणीकरण का संयोजन करता है मैंने "वेब एप्लिकेशन (मॉडल-व्यू-कंट्रोलर)" टेम्पलेट और "नेट" का उपयोग करके वीएस 17 में एक नया एएसपी.नेट कोर वेब एप्लिकेशन प्रोजेक्ट बनाया है। फ्रेमवर्क "+" एएसपी.नेट कोर 2 "विन्यास के रूप में। प्रमाणीकरण कॉन्फ़िगरेशन "व्यक्तिगत उपयोगकर्ता खाते" पर सेट है।एएसपी.NET कोर 2.0 एक ही एंडपॉइंट

[Produces("application/json")] 
[Route("api/price")] 
[Authorize(Roles = "PriceViwer", AuthenticationSchemes = "Cookies,Bearer")] 
public class PriceController : Controller 
{ 

    public IActionResult Get() 
    { 
     return Ok(new Dictionary<string, string> { {"Galleon/Pound", 
                "999.999" }); 
    } 
} 

"Cookies,Bearer"CookieAuthenticationDefaults.AuthenticationScheme और JwtBearerDefaults.AuthenticationScheme श्रृंखलाबद्ध द्वारा लिया गया है:

मैं निम्न नमूना समाप्ति बिंदु है।

उद्देश्य अंतिम बिंदु के लिए प्राधिकरण को कॉन्फ़िगर करने में सक्षम होना है ताकि यह टोकन और कुकी प्रमाणीकरण विधियों दोनों का उपयोग करके इसे एक्सेस कर सके।

services.AddAuthentication() 
     .AddCookie(cfg => { cfg.SlidingExpiration = true;}) 
     .AddJwtBearer(cfg => { 
      cfg.RequireHttpsMetadata = false; 
      cfg.SaveToken = true; 
      cfg.TokenValidationParameters = new TokenValidationParameters() { 
                ValidIssuer = Configuration["Tokens:Issuer"], 
                ValidAudience = Configuration["Tokens:Issuer"], 
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])) 
               }; 
     }); 

तो, जब मैं एक ब्राउज़र का उपयोग कर अंत बिंदु तक पहुँचने का प्रयास, I get the 401 response with a blank html page.

तो मैं के लिए लॉग इन और जब मैं कोशिश:

यहाँ सेटअप मैं प्रमाणीकरण के लिए है मेरी Startup.cs में है एंडपॉइंट को दोबारा एक्सेस करने के लिए, मुझे वही प्रतिक्रिया मिलती है।

फिर, मैं भालू टोकन निर्दिष्ट करके एंडपॉइंट तक पहुंचने का प्रयास करता हूं। कुकी प्रमाणीकरण काम करता है लेकिन एक ही वाहक टोकन पद्धति के रूप में ऊपर उपयोग किसी भी परिणाम नहीं देता है और बस डिफ़ॉल्ट AspIdentity लॉगिन पृष्ठ पर रीडायरेक्ट और 200 देता है, - And that returns the desired result with the 200 response.

तो फिर, अगर मैं [Authorize(AuthenticationSchemes = "Cookies,Bearer")] निकालने के लिए, स्थिति विपरीत हो जाता है ।

मैं यहाँ दो संभावित समस्याओं देख सकते हैं:

1) ASP.NET कोर की अनुमति नहीं है 'संयुक्त' प्रमाणीकरण। 2) 'कुकीज़' वैध स्कीमा नाम नहीं है। लेकिन फिर उपयोग करने का सही क्या है?

कृपया सलाह दें। धन्यवाद।

+0

क्या आप आइडेंटिटी का उपयोग करते हैं? – Nikolaus

+0

मैं एस्पनेट कोर 1.0 में एक ही कुकी और बेयरर का उपयोग कर रहा हूं। 2.0 में माइग्रेट करने के लिए मुझे एक ही समस्या होगी :( – Ruchan

+0

यह बहुत अच्छा होगा अगर हमें सभी कार्यों पर 'प्रमाणीकरण स्केम' का उल्लेख नहीं करना पड़ेगा। – Ruchan

उत्तर

3

मुझे लगता है कि आपको अपने नियंत्रक को प्रमाणीकरणशेक सेट करने की आवश्यकता नहीं है। बस इस तरह ConfigureServices में प्रमाणीकृत उपयोगकर्ता का उपयोग करें:

// requires: using Microsoft.AspNetCore.Authorization; 
//   using Microsoft.AspNetCore.Mvc.Authorization; 
services.AddMvc(config => 
{ 
    var policy = new AuthorizationPolicyBuilder() 
        .RequireAuthenticatedUser() 
        .Build(); 
    config.Filters.Add(new AuthorizeFilter(policy)); 
}); 

मेरे सूत्रों के प्रलेखन के लिए: registerAuthorizationHandlers

भाग के लिए, कि क्या योजना कुंजी मान्य नहीं था, तो आप एक अंतर्वेशित स्ट्रिंग इस्तेमाल कर सकते हैं, उपयोग करने के लिए सही कुंजियाँ:

[Authorize(AuthenticationSchemes = $"{CookieAuthenticationDefaults.AuthenticationScheme},{JwtBearerDefaults.AuthenticationScheme}")] 

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

//private method 
private IActionResult GetThingPrivate() 
{ 
    //your Code here 
} 

//Jwt-Method 
[Authorize(AuthenticationSchemes = $"{JwtBearerDefaults.AuthenticationScheme}")] 
[HttpGet("bearer")] 
public IActionResult GetByBearer() 
{ 
    return GetThingsPrivate(); 
} 

//Cookie-Method 
[Authorize(AuthenticationSchemes = $"{CookieAuthenticationDefaults.AuthenticationScheme}")] 
[HttpGet("cookie")] 
public IActionResult GetByCookie() 
{ 
    return GetThingsPrivate(); 
} 
+0

प्रतिक्रिया धन्यवाद! दुर्भाग्यवश यह समस्या को ठीक नहीं करता है: यदि मैं आपकी टिप्पणी से कॉन्फ़िगर स्निपेट का उपयोग करता हूं, और एंडपॉइंट सजावट से प्रमाणीकरणशेम को हटा देता हूं, तो मानक कुकी विधि काम करती है, लेकिन टोकन कोई नहीं करता है। – maximiniini

+0

@maximiniini क्या आपने आदेश को उलट करने की कोशिश की? पसंद: '[अधिकृत (प्रमाणीकरण स्केम्स =" बेयरर, कुकीज़ ")]' – Nikolaus

+0

@ मैक्सिमिनीनी मैंने अपना जवाब अपडेट किया। शायद यह आपकी मदद कर सकता है। – Nikolaus