কীভাবে এএসপি.নেট এমভিসি তে ডায়নামিক লগইন ইউআরএল এ যেতে হবে


96

আমি একটি বহু-ভাড়াটে ওয়েবসাইট তৈরি করছি যা ক্লায়েন্টদের জন্য পৃষ্ঠাগুলি হোস্ট করে। ইউআরএলটির প্রথম বিভাগটি এমন একটি স্ট্রিং হবে যা ক্লায়েন্টকে চিহ্নিত করে, নিম্নলিখিত ইউআরএল রাউটিং স্কিমটি ব্যবহার করে গ্লোবাল.অ্যাসাক্সে সংজ্ঞায়িত:

"{client}/{controller}/{action}/{id}"

এটি URL / যেমন / foo / হোম / সূচক হিসাবে ভাল কাজ করে।

তবে, [অনুমোদিত] বৈশিষ্ট্যটি ব্যবহার করার সময়, আমি লগইন পৃষ্ঠায় পুনর্নির্দেশ করতে চাই যা একই ম্যাপিং স্কিমটিও ব্যবহার করে। সুতরাং ক্লায়েন্ট যদি foo হয় তবে লগইন পৃষ্ঠাটি ওয়েব / কনফিগে সংজ্ঞায়িত / অ্যাকাউন্ট / লগইন পুনর্নির্দেশের পরিবর্তে / foo / অ্যাকাউন্ট / লগইন হবে।

এমভিসি একটি 401 অননুমোদিত স্থিতি ফিরিয়ে আনতে একটি HTTPUnauthorisedResult ব্যবহার করে, যা আমি অনুমান করি যে এএসপি.এনইটি ওয়েবকনফিগে সংজ্ঞায়িত পৃষ্ঠায় পুনর্নির্দেশের কারণ ঘটায়।

সুতরাং কেউ কীভাবে এএসপি.নেট লগইন আচরণের পুনর্নির্দেশের আচরণটি ওভাররাইড করবেন তা জানেন? অথবা কাস্টম অনুমোদনের বৈশিষ্ট্য তৈরি করে এমভিসিতে পুনঃনির্দেশ করা ভাল?

সম্পাদনা - উত্তর:। নেট উত্সে কিছু খননের পরে, আমি সিদ্ধান্ত নিয়েছি যে একটি কাস্টম প্রমাণীকরণ বৈশিষ্ট্যই সেরা সমাধান:

public class ClientAuthorizeAttribute: AuthorizeAttribute
{
    public override void OnAuthorization( AuthorizationContext filterContext )
    {
        base.OnAuthorization( filterContext );

        if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult )
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                {
                    { "client", filterContext.RouteData.Values[ "client" ] },
                    { "controller", "Account" },
                    { "action", "Login" },
                    { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
                });
        }
    }
}

4
রাউটিংয়ের সাথে প্রায় একই জিনিসটি করা, তাই আমার এটির প্রয়োজন ছিল! ধন্যবাদ!
ট্রেভর ডি কোয়েকোয়েক

ধন্যবাদ, আমি কীভাবে অনুরূপ কিছু করতে পারি তা বোঝার চেষ্টা করছিলাম।
চান্স

এটি আমাকে নিজের বাস্তবায়নের জন্য ধারণা দিয়েছে, অনেক ধন্যবাদ!
আলেকজান্ডার ব্লেটস্কি

4
এমভিসি 2 এবং তার বেশি ব্যবহার করে ক্ষেত্রফল = নাল (বা সঠিক অঞ্চলে)
সুনিশ্চিত করুন

এমভিসি ছাড়াই এটি করার কোনও উপায়?
ডার্কগুই

উত্তর:


30

আমি মনে করি মূল সমস্যাটি হ'ল আপনি যদি অন্তর্নির্মিত এএসপি.নেট ফর্মস অ্যাটেন্টিকেশন ক্লাসে পিগব্যাক করতে চলেছেন (এবং আপনার কোনও ভাল কারণ নেই) তবে দিনের শেষে কিছু কল হতে চলেছে FormsAuthentication.RedirectToLoginPage() হতে চলেছে যা যাচ্ছে একটি কনফিগার করা URL দেখুন। এখানে কেবলমাত্র একটি লগইন ইউআরএল রয়েছে এবং তারা ঠিক কীভাবে এটি ডিজাইন করেছিলেন।

সমস্যায় আমার ছুরিকাঘাত (সম্ভবত একটি রুবে গোল্ডবার্গ বাস্তবায়ন) হ'ল এটি সমস্ত ক্লায়েন্টদের দ্বারা ভাগ করে নেওয়া মূলটিতে একক লগইন পৃষ্ঠায় পুনর্নির্দেশ করা যাক, অ্যাকাউন্ট / লগইন বলুন। এই লগইন পৃষ্ঠাটি আসলে কিছুই প্রদর্শন করবে না; এটি হয় রিটার্নআরল প্যারামিটার বা সেশনে আমি পেয়েছি এমন কোনও মান বা একটি কুকি যা ক্লায়েন্টকে সনাক্ত করে এবং তা নির্দিষ্ট / ক্লায়েন্ট / অ্যাকাউন্ট / লগইন পৃষ্ঠায় তাত্ক্ষণিক 302 পুনর্নির্দেশ জারি করতে ব্যবহার করে। এটি একটি অতিরিক্ত পুনর্নির্দেশ, তবে সম্ভবত লক্ষণীয় নয় এবং এটি আপনাকে বিল্ট ইন পুনঃনির্দেশ প্রক্রিয়াগুলি ব্যবহার করতে দেয়।

অন্য বিকল্পটি হ'ল আপনার নিজস্ব কাস্টম অ্যাট্রিবিউট তৈরি করার সাথে সাথে আপনি ক্লাসে RedirectToLoginPage()পদ্ধতিটিকে কল করে এমন কোনও কিছু এড়িয়ে FormsAuthenticationযাবেন, যেহেতু আপনি এটিকে আপনার নিজের পুনঃনির্দেশ যুক্তি দিয়ে প্রতিস্থাপন করবেন। (আপনি নিজের শ্রেণিটি একইরকম তৈরি করতে পারেন Since) এটি যেহেতু এটি একটি স্থির শ্রেণি, তাই আমি কোনও প্রক্রিয়া সম্পর্কে অবগত নই যার দ্বারা আপনি কেবল নিজের বিকল্প ইন্টারফেসটি ইনজেক্ট করতে পারেন এবং বিদ্যমান [অনুমোদন] বৈশিষ্ট্যটির সাথে এটি যাদুতে কাজ করতে পারেন, যা আঘাত, কিন্তু মানুষ এর আগেও একই কাজ করেছে

আশা করি এইটি কাজ করবে!


এটি সম্ভবত নিরাপদ পদ্ধতি। আপনার নিজের [MyAuthorize] বৈশিষ্ট্য তৈরি করা বিপজ্জনক। যদি না আপনার বিল্ডটি যাচাই করে না যে লোকেরা অন্তর্নির্মিত [অনুমোদন] বৈশিষ্ট্যটি ব্যবহার করে না আপনি লোকেদের (বা নিজেকে) ভুল এবং
ভুলটিকে

কিছু ক্ষেত্রে এটি ওভাররাইড করা সহায়ক হতে পারে Application_AuthenticateRequest(নীচে আমার উত্তর দেখুন)।
টারডুস-মেরুলা

41

এএসপি.নেট এমভিসির আরটিএম সংস্করণে, বাতিল সম্পত্তিটি নিখোঁজ রয়েছে। এই কোডটি এএসপি.নেট এমভিসি আরটিএমের সাথে কাজ করে:

using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Resources;

namespace ePegasus.Web.ActionFilters
{
    public class CustomAuthorize : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            if (filterContext.Result is HttpUnauthorizedResult)
            {
                filterContext.Result = new RedirectToRouteResult(
                    new System.Web.Routing.RouteValueDictionary
                        {
                                { "langCode", filterContext.RouteData.Values[ "langCode" ] },
                                { "controller", "Account" },
                                { "action", "Login" },
                                { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
                        });
            }
        }
    }
}

সম্পাদনা করুন: আপনি ওয়েবকনফিগে ডিফল্ট ফর্ম প্রমাণীকরণ লগইন ইউআরএল অক্ষম করতে চাইতে পারেন - যদি কেউ আপনার কাস্টম বৈশিষ্ট্যটি ভুলে যায় এবং ভুলভাবে বিলম্বিত [অনুমোদন] বৈশিষ্ট্যটি ব্যবহার করে।

ওয়েব কোডফাইগ এ মান পরিবর্তন করুন:

 <forms loginUrl="~/Account/ERROR" timeout="2880" />

তারপরে একটি ক্রিয়া পদ্ধতি 'ERROR' করুন যা কোনও ত্রুটি লগ করে এবং ব্যবহারকারীকে আপনার সর্বাধিক জেনেরিক লগইন পৃষ্ঠাতে পুনঃনির্দেশ করে।


4
MVC 2 এবং উপরে ব্যবহার করে অভিধানে (বা আপনার অঞ্চলটি যাই হোক না কেন) অভিধানে {অঞ্চল, নাল add যুক্ত করার বিষয়টি নিশ্চিত করুন - অথবা অন্যথায় আপনি যে পৃষ্ঠাটি দেখার চেষ্টা করেছেন তা উত্তরাধিকার সূত্রে প্রাপ্ত হবে
সাইমন_উইভার

2

এই সমস্যার আমার সমাধানটি একটি কাস্টম ActionResultশ্রেণি ছিল:

    sealed public class RequiresLoginResult : ActionResult
    {
        override public void ExecuteResult (ControllerContext context)
        {
            var response = context.HttpContext.Response;

            var url = FormsAuthentication.LoginUrl;
            if (!string.IsNullOrWhiteSpace (url))
                url += "?returnUrl=" + HttpUtility.UrlEncode (ReturnUrl);

            response.Clear ();
            response.StatusCode = 302;
            response.RedirectLocation = url;
        }

        public RequiresLoginResult (string returnUrl = null)
        {
            ReturnUrl = returnUrl;
        }

        string ReturnUrl { get; set; }
    }

0

এখনও, যদি একটি ব্যবহার করার সিদ্ধান্ত নেয় বিল্ট-ইন ASP.NET FormsAuthentication, এক overide করতে Application_AuthenticateRequestমধ্যে Global.asax.csনিম্নরূপ:

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    string url = Request.RawUrl;

    if (url.Contains(("Account/Login"))
    {
        return;
    }

    if (Context.User == null)
    {
        // Your custom tenant-aware logic
        if (url.StartsWith("/foo"))
        {
            // Your custom login page.
            Response.Redirect("/foo/Account/Login");
            Response.End();
            return;
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.