অনুমোদন এবং অনুমোদন ব্যর্থতার জন্য কেন অনুমোদনশাস্ত্র লগইন পৃষ্ঠায় পুনর্নির্দেশ করে?


265

এএসপি.এনইটি এমভিসিতে আপনি এর সাথে একটি নিয়ামক পদ্ধতি চিহ্নিত করতে পারেন AuthorizeAttribute:

[Authorize(Roles = "CanDeleteTags")]
public void Delete(string tagName)
{
    // ...
}

এর অর্থ হ'ল, যদি বর্তমানে লগ ইন করা ব্যবহারকারী "ক্যানডিলেটট্যাগস" ভূমিকাটিতে না থাকে তবে নিয়ামক পদ্ধতিটি কখনও কল করা হবে না।

দুর্ভাগ্যক্রমে, ব্যর্থতার জন্য, AuthorizeAttributeপ্রত্যাবর্তন HttpUnauthorizedResult, যা সর্বদা HTTP স্থিতি কোড 401 ফেরত দেয় This এটি লগইন পৃষ্ঠায় পুনর্নির্দেশের কারণ ঘটায়।

যদি ব্যবহারকারী লগ ইন না করে থাকেন তবে এটি সঠিক ধারণা দেয়। তবে, ব্যবহারকারী যদি ইতিমধ্যে লগ ইন থাকে তবে প্রয়োজনীয় ভূমিকা না রাখে তা তাদের লগইন পৃষ্ঠায় ফেরত পাঠানো বিভ্রান্তিকর।

দেখে মনে হচ্ছে AuthorizeAttributeপ্রমাণীকরণ এবং অনুমোদনের সাথে মিল রয়েছে।

এটি ASP.NET MVC তে কিছুটা পর্যবেক্ষণের মতো বলে মনে হচ্ছে, বা আমি কি কিছু হারিয়ে ফেলছি?

আমি একটি রান্না করতে হবে DemandRoleAttributeযে দুটি পৃথক। ব্যবহারকারী প্রমাণীকরণ না করা হলে, এটি লগইন পৃষ্ঠায় প্রেরণ করে HTTP 401 প্রদান করে। যখন ব্যবহারকারী লগ ইন থাকে তবে প্রয়োজনীয় ভূমিকাতে না থাকে, তার NotAuthorizedResultপরিবর্তে এটি তৈরি করে। বর্তমানে এটি একটি ত্রুটি পৃষ্ঠায় পুনঃনির্দেশ করে।

নিশ্চয়ই আমাকে এই কাজ করতে হবে না?


10
দুর্দান্ত প্রশ্ন এবং আমি সম্মত, এটি একটি HTTP নয় অনুমোদিত স্থিতি নিক্ষেপ করা উচিত।
খাঁটি.ক্রোম

3
আমি আপনার সমাধান পছন্দ করি, রজার। না করলেও।
জন ডেভিস

আমার লগইন পৃষ্ঠায় ব্যবহারকারীকে কেবল রিটার্নআরএল-এ পুনঃনির্দেশ করার জন্য একটি চেক রয়েছে, যদি সে ইতিমধ্যে স্বায়ত্তশাসিত থাকে। সুতরাং আমি 302 পুনঃনির্দেশগুলির একটি অসীম লুপ তৈরি করতে পরিচালিত করেছি: ডি ওয়াট।
জুহান_h

1
পরীক্ষা করে দেখুন এই
জোগি

রজার, আপনার সমাধানের ভাল নিবন্ধ - red-gate.com/simple-talk/dotnet/asp-net/… মনে হয় আপনার সমাধানটি পরিষ্কারভাবে এটি করার একমাত্র উপায়
ক্রেগ

উত্তর:


305

যখন এটি প্রথম বিকাশ করা হয়েছিল, System.Web.Mvc.AuthorizeAttribute সঠিক কাজটি করছিল - এইচটিটিপি স্পেসিফিকেশনের পুরানো সংশোধনীগুলি "অননুমোদিত" এবং "অননুমোদিত" উভয়ের জন্য স্থিতি কোড 401 ব্যবহার করেছিল।

মূল স্পেসিফিকেশন থেকে:

যদি অনুরোধটিতে ইতিমধ্যে অনুমোদনের শংসাপত্রগুলি অন্তর্ভুক্ত থাকে তবে 401 প্রতিক্রিয়াটি নির্দেশ করে যে সেই শংসাপত্রগুলির জন্য অনুমোদন প্রত্যাখ্যান করা হয়েছে।

আসলে, আপনি ঠিক সেখানে বিভ্রান্তি দেখতে পাচ্ছেন - এটি "অনুমোদন" শব্দটি ব্যবহার করে যখন এর অর্থ "প্রমাণীকরণ"। যদিও প্রতিদিনের অনুশীলনে ব্যবহারকারী অনুমোদনপ্রাপ্ত তবে অনুমোদিত না হলে 403 জন নিষিদ্ধ হওয়া প্রত্যাবর্তন করা আরও বোধগম্য হয়। ব্যবহারকারীর কাছে শংসাপত্রগুলির একটি দ্বিতীয় সেট থাকবে যা তাদের অ্যাক্সেস দিতে পারে - চারপাশে খারাপ ব্যবহারকারীর অভিজ্ঞতা।

বেশিরভাগ অপারেটিং সিস্টেম বিবেচনা করুন - যখন আপনি কোনও ফাইল পড়ার চেষ্টা করেন যখন আপনার অ্যাক্সেস করার অনুমতি নেই, আপনাকে লগইন স্ক্রিন প্রদর্শিত হবে না!

ধন্যবাদ, অস্পষ্টতা অপসারণ করতে HTTP স্পেসিফিকেশন আপডেট করা হয়েছিল (জুন 2014) 2014

"হাইপার টেক্সট ট্রান্সপোর্ট প্রোটোকল (HTTP / 1.1) থেকে: প্রমাণীকরণ" (আরএফসি 7235):

401 (অননুমোদিত) স্থিতি কোডটি নির্দেশ করে যে অনুরোধটি প্রয়োগ করা হয়নি কারণ লক্ষ্য সংস্থার জন্য বৈধ প্রমাণীকরণের শংসাপত্রের অভাব রয়েছে।

"হাইপারটেক্সট ট্রান্সফার প্রোটোকল (HTTP / 1.1): শব্দার্থবিজ্ঞান এবং সামগ্রী" (আরএফসি 7231) থেকে:

403 (নিষিদ্ধ) স্থিতি কোডটি ইঙ্গিত দেয় যে সার্ভারটি অনুরোধটি বুঝতে পেরেছিল কিন্তু এটি অনুমোদিত করতে অস্বীকার করেছে।

মজার ব্যাপারটি যথেষ্ট, এএসপি.এনইটি এমভিসি 1 প্রকাশিত হওয়ার সময় অথরিজঅ্যাট্রিবিউটের আচরণটি সঠিক ছিল। এখন, আচরণটি ভুল - HTTP / 1.1 নির্দিষ্টকরণ স্থির করা হয়েছিল was

এএসপি.এনইটি-র লগইন পৃষ্ঠাটি পুনঃনির্দেশগুলি পরিবর্তনের প্রয়াসের পরিবর্তে উত্সটিতে সমস্যা সমাধান করা সহজ। আপনি আপনার ওয়েবসাইটের ডিফল্ট নেমস্পেসে একই নামের ( AuthorizeAttribute) দিয়ে একটি নতুন বৈশিষ্ট্য তৈরি করতে পারেন (এটি খুব গুরুত্বপূর্ণ) তবে সংকলকটি স্বয়ংক্রিয়ভাবে এমভিসির মানকটির পরিবর্তে এটি বাছাই করবে। অবশ্যই আপনি যদি এই উপায়টি গ্রহণ করেন তবে আপনি সর্বদা বৈশিষ্ট্যটিকে একটি নতুন নাম দিতে পারেন could

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

52
+1 খুব ভাল পন্থা। একটি ছোট পরামর্শ: পরীক্ষণ পরিবর্তে filterContext.HttpContext.User.Identity.IsAuthenticated, আপনি শুধু পরীক্ষা করতে পারবেন filterContext.HttpContext.Request.IsAuthenticatedযা নির্মিত নাল চেক দিয়ে আসে দেখুন। Stackoverflow.com/questions/1379566/...
ড্যানিয়েল Liuzzi

> আপনি নিজের ওয়েবসাইটের ডিফল্ট নেমস্পেসে একই নামের (অথরিজঅ্যাট্রিবিউট) দিয়ে একটি নতুন বৈশিষ্ট্য তৈরি করতে পারেন তবে সংকলক স্বয়ংক্রিয়ভাবে এমভিসির মানকটির পরিবর্তে এটি বাছাই করবে। এর ফলে একটি ত্রুটি ঘটে: টাইপ বা নেমস্পেস 'অথরাইজ' সন্ধান করা যায়নি (আপনি কোনও নির্দেশিকা বা বিধানসভা রেফারেন্স মিস করছেন?) উভয়ই System.Web.Mvc ব্যবহার করছেন; এবং আমার কাস্টম কর্তৃপক্ষএট্রিবিউট শ্রেণীর নাম স্থানটি নিয়ামকটিতে উল্লেখ করা হয়। এটি সমাধান করার জন্য আমাকে [মাইনেমস্পেস.অথরাইজ] ব্যবহার করতে হয়েছিল
ঝড়ওয়ালা

2
@ ডেপেটর স্পেক কখনও পুনর্নির্দেশ সম্পর্কে কিছু বলেনি তাই কেন পুনর্নির্দেশ করা আরও ভাল সমাধান? এটি কেবলমাত্র এজাক্সের অনুরোধগুলি সমাধান করার জন্য কোনও হ্যাক ছাড়াই হত্যা করে।
অ্যাডাম টিউলিপার - এমএসএফটি

1
এটি এমএস কানেক্টে লগ হওয়া উচিত কারণ এটি স্পষ্টত একটি আচরণগত বাগ। ধন্যবাদ।
টনি ওয়াল

বিটিডাব্লু, কেন আমাদের লগইন পৃষ্ঠায় পুনর্নির্দেশ করা হচ্ছে? কেন কেবল একই অনুরোধের মধ্যে একটি 401 কোড এবং লগইন পৃষ্ঠা আউটপুট না করে?
স্যান্ডরক

25

এটি আপনার লগইন পৃষ্ঠা_লড ফাংশনে যুক্ত করুন:

// User was redirected here because of authorization section
if (User.Identity != null && User.Identity.IsAuthenticated)
    Response.Redirect("Unauthorized.aspx");

যখন ব্যবহারকারীকে সেখানে পুনঃনির্দেশিত করা হয় তবে ইতিমধ্যে লগ ইন করা হয়, এটি অননুমোদিত পৃষ্ঠাটি দেখায়। যদি তারা লগ ইন না করে থাকে তবে এটি পড়ে এবং লগইন পৃষ্ঠাটি দেখায়।


18
পেজ_ল্ড হ'ল একটি ওয়েবফর্ম মোজো
সম্ভাবনা

2
@ চ্যান্স - তারপরে যে নিয়ামক বলা হয় সেখানে ডিফল্ট অ্যাকশনমঠোডে এটি করুন যেখানে ফর্মস অথেন্সেকশন কল করার জন্য সেটআপ হয়েছে।
খাঁটি.ক্রোম

এটি প্রকৃতপক্ষে সত্যিই ভাল কাজ করে যদিও এমভিসির পক্ষে এটি এমন কিছু হওয়া উচিত if (User.Identity != null && User.Identity.IsAuthenticated) return RedirectToRoute("Unauthorized");যেখানে অননুমোদিত একটি সংজ্ঞায়িত রুটের নাম।
মোশি মাছুয়া

সুতরাং আপনি কোনও সংস্থান জিজ্ঞাসা করেন, আপনি লগইন পৃষ্ঠায় পুনঃনির্দেশিত হন এবং আপনি আবার 403 পৃষ্ঠায় পুনঃনির্দেশিত হন? আমার কাছে খারাপ লাগছে। আমি এমনকি একজনকে পুনর্নির্দেশ করা মোটেও সহ্য করতে পারি না। আইএমও এই জিনিসটি খুব খারাপভাবেই নির্মিত।
স্যান্ডরক

3
আপনার সমাধান অনুসারে, আপনি যদি ইতিমধ্যে লগ ইন করে থাকেন এবং ইউআরএল টাইপ করে লগইন পৃষ্ঠাতে যান ... এটি আপনাকে অননুমোদিত পৃষ্ঠায় ফেলে দেবে। যা সঠিক নয়।
রাজশেকার রেড্ডি

4

আমি সবসময় ভাবতাম এটি বোধগম্য হয়। আপনি যদি লগ ইন হয়ে থাকেন এবং আপনি এমন কোনও পৃষ্ঠা হিট করার চেষ্টা করেন যা আপনার নিজের ভূমিকা না রাখার প্রয়োজন হয়, আপনি ভূমিকাটি থাকা কোনও ব্যবহারকারীর সাথে লগ ইন করার জন্য আপনাকে লগইন স্ক্রিনে এগিয়ে যেতে হবে।

আপনি লগইন পৃষ্ঠায় যুক্তি যুক্ত করতে পারেন যা ব্যবহারকারী ইতিমধ্যে প্রমাণীকৃত কিনা তা পরীক্ষা করে। আপনি একটি বন্ধুত্বপূর্ণ বার্তা যুক্ত করতে পারেন যা ব্যাখ্যা করে যে কেন তাদের আবার সেখানে বম করা হচ্ছে।


4
আমার অনুভূতিটি যে বেশিরভাগ লোকের দেওয়া ওয়েব অ্যাপ্লিকেশনটির জন্য একাধিক পরিচয় থাকার ঝোঁক নেই। যদি তারা তা করে, তবে তারা "আমার বর্তমান আইডিতে মোজো নেই, আমি অন্যটির মতো লগ ইন করব" ভেবে তারা যথেষ্ট স্মার্ট।
রজার লিপসক্বে

যদিও লগইন পৃষ্ঠায় কিছু প্রদর্শন করার বিষয়ে আপনার অন্য বিষয়টি ভাল। ধন্যবাদ।
রজার লিপসক্বে

4

দুর্ভাগ্যক্রমে, আপনি ASP.NET ফর্ম প্রমাণীকরণের ডিফল্ট আচরণের সাথে ডিল করছেন। এখানে আলোচনা করার মতো কাজ আছে (আমি এটি চেষ্টা করে দেখিনি):

http://www.codeproject.com/KB/aspnet/Custon401Page.aspx

(এটি এমভিসির সাথে সুনির্দিষ্ট নয়)

আমি মনে করি বেশিরভাগ ক্ষেত্রে সবচেয়ে ভাল সমাধান হ'ল ব্যবহারকারীর সেখানে যাওয়ার চেষ্টা করার আগে অননুমোদিত সংস্থানগুলিতে অ্যাক্সেস সীমাবদ্ধ করা। লিঙ্ক বা বোতামটি সরিয়ে / ধূসর করে যা তাদের এই অননুমোদিত পৃষ্ঠায় নিয়ে যেতে পারে।

অননুমোদিত ব্যবহারকারীকে কোথায় পুনর্নির্দেশ করতে হবে তা নির্দিষ্ট করার জন্য বৈশিষ্ট্যে অতিরিক্ত প্যারামিটারটি রাখা ভাল হবে। তবে এরই মধ্যে আমি সুরক্ষা নেট হিসাবে অথরিজঅ্যাট্রিবিউটের দিকে তাকাচ্ছি।


অনুমোদনের উপর ভিত্তি করে আমি লিঙ্কটি সরিয়ে নেওয়ার পরিকল্পনা করছি (আমি সে সম্পর্কে কোথাও একটি প্রশ্ন দেখেছি), তাই আমি পরে একটি এইচটিএমএল হেল্পার এক্সটেনশন পদ্ধতি কোড করব।
রজার লিপসক্বে

1
আমি এখনও ব্যবহারকারীকে সরাসরি ইউআরএল থেকে যেতে বাধা দিতে হবে, যা এই বৈশিষ্ট্যটি সম্পর্কে। আমি কাস্টম 401 সমাধানের সাথে খুব খুশি নই (কিছুটা বিশ্বব্যাপী বলে মনে হচ্ছে), তাই আমি আমার নটঅর্টিভাইজড রেজাল্টকে রেডাইরেক্টটোরআউরট রেজাল্টে মডেলিংয়ের চেষ্টা করব ...
রজার

0

আপনার গ্লোবাল.অ্যাসেক্স ফাইলের অ্যাপ্লিকেশন_এন্ডআরউইকস্ট হ্যান্ডলারে এটি ব্যবহার করে দেখুন

if (HttpContext.Current.Response.Status.StartsWith("302") && HttpContext.Current.Request.Url.ToString().Contains("/<restricted_path>/"))
{
    HttpContext.Current.Response.ClearContent();
    Response.Redirect("~/AccessDenied.aspx");
}

0

যদি আপনি অ্যাসপেটকোর ২.০ ব্যবহার করেন তবে এটি ব্যবহার করুন:

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace Core
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeApiAttribute : Microsoft.AspNetCore.Authorization.AuthorizeAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            var user = context.HttpContext.User;

            if (!user.Identity.IsAuthenticated)
            {
                context.Result = new UnauthorizedResult();
                return;
            }
        }
    }
}

0

আমার ক্ষেত্রে সমস্যাটি ছিল "এইচটিটিপি স্পেসিফিকেশন ব্যবহৃত হয়েছে" অননুমোদিত "এবং" অননুমোদিত "উভয়ের জন্য স্থিতি কোড 401। যেমনটি শ্যাডোচ্যাজার বলেছিলেন।

এই সমাধানটি আমার পক্ষে কাজ করে:

if (User != null &&  User.Identity.IsAuthenticated && Response.StatusCode == 401)
{
    //Do whatever

    //In my case redirect to error page
    Response.RedirectToRoute("Default", new { controller = "Home", action = "ErrorUnauthorized" });
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.