এএসপি.নেট ওয়েব এপিআই: 401 / অননুমোদিত প্রতিক্রিয়া ফিরিয়ে দেওয়ার সঠিক উপায়


104

আমার কাছে একটি এমভিসি ওয়েবপি সাইট রয়েছে যা অনুরোধগুলি প্রমাণীকরণের জন্য OAuth / টোকেন প্রমাণীকরণ ব্যবহার করে। সমস্ত প্রাসঙ্গিক নিয়ন্ত্রকের সঠিক বৈশিষ্ট্য রয়েছে এবং প্রমাণীকরণ ঠিক আছে working

সমস্যাটি হ'ল অনুরোধটির সমস্তটি কোনও গুণকের স্কোজে অনুমোদিত হতে পারে না - কিছু অনুমোদনের চেক কোডে করা উচিত যা নিয়ামক পদ্ধতি দ্বারা ডাকা হয় - এই ক্ষেত্রে 401 অননুমোদিত প্রতিক্রিয়া ফিরিয়ে দেওয়ার সঠিক উপায় কী?

আমি চেষ্টা করেছি throw new HttpException(401, "Unauthorized access");, কিন্তু আমি যখন এটি করি তখন প্রতিক্রিয়া স্থিতি কোডটি 500 হয় এবং আমি একটি স্ট্যাক ট্রেসও পাই। এমনকি আমাদের লগিং DelegatingHandler এ আমরা দেখতে পাচ্ছি যে প্রতিক্রিয়া 5001 নয়, 500 টি।


4
এই উত্তরটি লাইন থেকে তুলে নেওয়া প্রত্যেকের জন্য, আমি HttpResponseExceptionকখন ফিরে আসব তার পক্ষে কোনও ভারসাম্য নিক্ষেপের উপযুক্ত সময় সম্পর্কে চিন্তাভাবনা করার পরামর্শ দেব Unauthorized()। কোনও 'প্রত্যাশিত' ত্রুটির জন্য ব্যতিক্রমটি ব্যবহার করা কিছুটা অ্যান্টি-প্যাটার্ন, সুতরাং যদি এমন কিছু সমস্যা থাকে যে আপনি কলটি এই ভুলটি করার প্রত্যাশা করছেন, ফিরে আসা Unauthorized()সম্ভবত সঠিক কল। HttpResponseExceptionসত্যই অপ্রত্যাশিত জন্য সংরক্ষণ করুন ।
রিককি

কিছু আলোচনার জন্য github.com/aspnet/Mvc/issues/5507 দেখুন ।
রিককি

@ রিকি, 401 কোনও "প্রত্যাশিত" ত্রুটি নয়। - এটি একটি ব্যতিক্রমী পরিস্থিতি যার ফলে আপনি আপনার কর্মপ্রবাহকে বাতিল করতে পারেন (লগিংয়ের জন্য বাদে যা আপনি ইতিমধ্যে কোনও ব্যতিক্রমের জন্য করা উচিত ...) - যাইহোক, আপনি যদি আপনার নিয়ামকের কাছ থেকে কোনও শক্ত টাইপযুক্ত ফলাফল ফিরে আসতে চান ( যেমন ইউনিট পরীক্ষার স্বাচ্ছন্দ্যের জন্য), একটি ব্যতিক্রম স্পষ্টতই সেরা রুট।
BrainSlugs83

উত্তর:


145

আপনি HttpResponseExceptionআপনার এপিআই পদ্ধতি থেকে একটি নিক্ষেপ করা উচিত , না HttpException:

throw new HttpResponseException(HttpStatusCode.Unauthorized);

অথবা, আপনি যদি একটি কাস্টম বার্তা সরবরাহ করতে চান:

var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" };
throw new HttpResponseException(msg);

102

কেবল নিম্নলিখিতটি ফেরত দিন:

return Unauthorized();

4
আমি মনে করি গ্রহণযোগ্যরা ওপি-র প্রশ্নের বিশেষত উত্তর দেয়। আমার উত্তর প্রশ্নের শিরোনামটির উত্তর দেয় "এএসপি.নেট ওয়েব এপিআই: 401 / অননুমোদিত প্রতিক্রিয়া ফিরিয়ে দেওয়ার সঠিক উপায়"
জনআরেন্সবি

4
এই বার্তার কোনও ওভারলোডেড সংস্করণ কেন নেই কেউ জানেন?
সাইমন_উইভার

5
@ সিমন_উইভার কেন নেই তা জানেন না, তবে আপনি এটি করতে একটি ব্যবহার করতে পারেন return Content<string>(HttpStatusCode.Unauthorized, "Message");
রিককি

4
এটি সঠিক উত্তর হওয়া উচিত। 1 এটি সঠিক। 2) যদি পরবর্তী ফ্রেমওয়ার্কে এটি পরিবর্তন হয়, আপনাকে কোড পরিবর্তন করতে হবে না। 3) আপনার কোনও 401 এর কারণ সরবরাহ করার দরকার নেই This এটি ক্লায়েন্ট দ্বারা পরিচালিত হওয়া উচিত সার্ভারের দ্বারা নয়।
নিক টার্নার

4
এটি কোন গ্রন্থাগারে রয়েছে?
Nae থেকে

21

অন্যান্য উত্তরের বিকল্প হিসাবে আপনি যদি IActionResultকোনও এএসপি.এনইটি নিয়ামকের মধ্যে কোনও ফেরত চান তবে আপনি এই কোডটিও ব্যবহার করতে পারেন ।

এএসপি.নেট

 return Content(HttpStatusCode.Unauthorized, "My error message");

আপডেট: এএসপি.নেট কোর

উপরে কোড এএসপি.নেট কোরে কাজ করে না, আপনি এর পরিবর্তে এর মধ্যে একটি ব্যবহার করতে পারেন:

 return StatusCode((int)System.Net.HttpStatusCode.Unauthorized, "My error message");
 return StatusCode(Microsoft.AspNetCore.Http.StatusCodes.Status401Unauthorized, "My error message");
 return StatusCode(401, "My error message");

দৃশ্যত কারণটির বাক্যাংশটি বেশ optionচ্ছিক ( কোনও HTTP প্রতিক্রিয়া কারণ-বাক্যাংশ বাদ দিতে পারে? )


4
এটি আর ControllerBaseএএসপি.নেট কোরে আর কাজ করে না, ক্লাসে (এএসপি.নেট কোর ওয়েবএপিআই ব্যবহৃত হয়) আর কোনও Contentওভারলোড থাকে না যা এইচটিপিপি স্থিতি কোডটি গ্রহণ করে।
দাই

এটা ভুল. একটি সামগ্রীর প্রতিক্রিয়া হ'ল 200 ওকে স্থিতি। সার্ভারের 401 পাঠানো উচিত এবং ক্লায়েন্টটি সেই অনুযায়ী পরিচালনা করতে হবে। 401 হিসাবে 200 জন পাঠাতে পারবেন না It ক্লায়েন্ট যদি 401 পায় তবে এটি উফ নয়, এটি আপনার আইন ভঙ্গ করছে।
নিক টার্নার

এই কোডটি HttpStatusCode.Unauthorized200 নয় একটি 401 স্থিতি কোড ( ) প্রেরণ Content(...)করছে a প্রদত্ত HTTP স্থিতি কোড সহ কোনও প্রদত্ত সামগ্রী ফেরত দেওয়ার জন্য কেবল একটি শর্টহ্যান্ড। যদি আপনি 200 প্রেরণ করতে চান তবে আপনি ব্যবহার করতে পারেনOk(...)
অ্যালেক্স এআইটি

@ নিক্টার্নার - এটি ওয়েবপিপি 2 কনটেন্ট () পদ্ধতির পক্ষে যুক্তিযুক্ত নয় যে এটির ভুল উত্তর না হওয়ার কারণে নামটি নষ্ট করা হচ্ছে। যেহেতু (স্ট্যাটাস, বার্তা) পদ্ধতির নামটি নেটকরে নতুন নামকরণ করা হয়েছে, আমার ধারণা অনুমান করা হয়েছে যে এটির নামকরণ খারাপভাবে করা হয়েছিল s
ক্রিস এফ ক্যারল

9

আপনি একটি 500 প্রতিক্রিয়া কোড পান কারণ আপনি একটি ব্যতিক্রম ছোঁড়াচ্ছেন (এটি HttpException) যা কোনও ধরণের সার্ভার ত্রুটি নির্দেশ করে, এটিই ভুল পদ্ধতির।

কেবল প্রতিক্রিয়া স্থিতি কোড সেট করুন .eg

Response.StatusCode = (int)HttpStatusCode.Unauthorized;

এটি কিছুটা অদ্ভুত যে ব্যতিক্রমটি HTTP স্থিতি কোডটিকে প্যারামিটার হিসাবে গ্রহণ করে এবং ইন্টিলিসেন্স ডক্স বলে যে এটি ক্লায়েন্টকে প্রেরণ করা স্ট্যাটাস কোড - আমি নিজেকে সরাসরি প্রতিক্রিয়া এড়াতে আশা করছিলাম কারণ এটি ত্রুটি প্রবণ বলে মনে হচ্ছে, দেখছি এর বৈশ্বিক রাষ্ট্র
GoatInTheMachine

4
বেস ওয়েব এপিআই নিয়ন্ত্রণকারী কোনও Responseসম্পত্তি প্রকাশ করে না ।
লুক 6

3

ASP.NET কোর> = 1.0 এ থাকা একটি বিদ্যমান উত্তরে যুক্ত করতে আপনি পারেন

return Unauthorized();

return Unauthorized(object value);

ক্লায়েন্টের কাছে তথ্য দেওয়ার জন্য আপনি এই জাতীয় কল করতে পারেন:

return Unauthorized(new { Ok = false, Code = Constants.INVALID_CREDENTIALS, ...});

401 প্রতিক্রিয়া ছাড়াও ক্লায়েন্টে আপনার কাছে পাস করা ডেটাও থাকবে। উদাহরণস্বরূপ বেশিরভাগ ক্লায়েন্টের কাছে আপনি await response.json()এটি পেতে পারেন।


3

নেট কোর আপনি ব্যবহার করতে পারেন

return new ForbidResult();

পরিবর্তে

return Unauthorized();

যা সরাসরি 401 দেওয়ার পরিবর্তে ডিফল্ট অননুমোদিত পৃষ্ঠায় (অ্যাকাউন্ট / অ্যাক্সেসডেইনড) পুনঃনির্দেশ করার সুবিধা দেয়

ডিফল্ট অবস্থান পরিবর্তন করতে আপনার startup.cs পরিবর্তন করুন

services.AddAuthentication(options =>...)
            .AddOpenIdConnect(options =>...)
            .AddCookie(options =>
            {
                options.AccessDeniedPath = "/path/unauthorized";

            })

প্রশ্নটি একটি ওয়েব এপিআই সম্পর্কে। সুতরাং এটি ভুল না হলে একটি অবৈধ উত্তর হবে? এপিআই'র 'ক্রিয়া' ফিরিয়ে দেওয়া উচিত নয়, কেবল ফলাফল।
নীলস লুকাস

1

আপনি এসপ নেট কোর 2.0 তে অনুসরণ কোড ব্যবহার করতে পারেন:

public IActionResult index()
{
     return new ContentResult() { Content = "My error message", StatusCode = (int)HttpStatusCode.Unauthorized };
}

1

আপনি এই কোডটিও অনুসরণ করেন:

var response = new HttpResponseMessage(HttpStatusCode.NotFound)
{
      Content = new StringContent("Users doesn't exist", System.Text.Encoding.UTF8, "text/plain"),
      StatusCode = HttpStatusCode.NotFound
 }
 throw new HttpResponseException(response);

আপনি যদি কন্সট্রাক্টরের কাছে পাস করেন তবে আপনাকে আবার স্ট্যাটাসকোড সেট করার দরকার নেই - হয় ভাল ব্যবহার করে
জন স্টোরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.