কীভাবে একটি এএসপি.নেট ওয়েব এপিআই সুরক্ষিত করবেন [বন্ধ]


397

তৃতীয় পক্ষের বিকাশকারীরা আমার অ্যাপ্লিকেশনটির ডেটা অ্যাক্সেস করতে ব্যবহার করবে এমন এএসপি.এনইটি ওয়েব এপিআই ব্যবহার করে আমি একটি রেস্টস্টুল ওয়েব পরিষেবা তৈরি করতে চাই।

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

এমন কোনও নমুনা আছে যা বাস্তবে তৈরি করে এবং কাজ করে এবং দেখায় যে এটি কীভাবে বাস্তবায়ন করা যায়?

আমি অসংখ্য নমুনা ডাউনলোড করেছি:

  • ডটনেটআউথ - ডকুমেন্টেশন একটি নবাগত দৃষ্টিভঙ্গি থেকে নিরাশ
  • চিন্তাধারা - এটি নির্মাণ করতে পারে না

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

দেখে মনে হচ্ছে এসও তে এই জাতীয় অনেক প্রশ্ন রয়েছে তবে ভাল উত্তর নেই।

সবাই এই জায়গায় কি করছে?

উত্তর:


292

হালনাগাদ:

আমি JWT- এ আগ্রহী যে কেউ এখানে ASP.NET ওয়েব API এর জন্য JWT প্রমাণীকরণটি কীভাবে ব্যবহার করতে হয় তা আমার অন্য উত্তরের সাথে এই লিঙ্কটি যুক্ত করেছি ।


ওয়েব এপিআই সুরক্ষিত করার জন্য আমরা এইচএমএসি প্রমাণীকরণ প্রয়োগ করতে পেরেছি এবং এটি ঠিক আছে। এইচএমএসি প্রমাণীকরণ প্রতিটি গ্রাহকের জন্য একটি গোপন কী ব্যবহার করে যা গ্রাহক এবং সার্ভার উভয়ই হ্যাশ করতে একটি বার্তা জানতে জানে, এইচএমএসি 256 ব্যবহার করা উচিত। বেশিরভাগ ক্ষেত্রে গ্রাহকের হ্যাশ পাসওয়ার্ড একটি গোপন কী হিসাবে ব্যবহৃত হয়।

বার্তাটি সাধারণত HTTP অনুরোধের ডেটা থেকে তৈরি করা হয়, বা এমনকী কাস্টমাইজড ডেটা যা HTTP শিরোনামে যুক্ত হয়, বার্তায় অন্তর্ভুক্ত থাকতে পারে:

  1. টাইমস্ট্যাম্প: অনুরোধটি প্রেরণের সময় (ইউটিসি বা জিএমটি)
  2. HTTP ক্রিয়া: GET, POST, PUT, DELETE।
  3. পোস্ট ডেটা এবং কোয়েরি স্ট্রিং,
  4. URL টি

ফণা অধীনে, এইচএমএসি প্রমাণীকরণ হবে:

গ্রাহক ওয়েব সার্ভারে এইচটিটিপি অনুরোধ প্রেরণ করে, স্বাক্ষর তৈরির পরে (এইচএমএসি হ্যাশের আউটপুট), এইচটিটিপি অনুরোধের টেম্পলেট:

User-Agent: {agent}   
Host: {host}   
Timestamp: {timestamp}
Authentication: {username}:{signature}

জিইটি অনুরোধের উদাহরণ:

GET /webapi.hmac/api/values

User-Agent: Fiddler    
Host: localhost    
Timestamp: Thursday, August 02, 2012 3:30:32 PM 
Authentication: cuongle:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=

স্বাক্ষর পেতে হ্যাশ বার্তা:

GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n

ক্যোয়ারী স্ট্রিং সহ পোষ্ট অনুরোধের উদাহরণ (নীচে স্বাক্ষর সঠিক নয়, কেবল একটি উদাহরণ)

POST /webapi.hmac/api/values?key2=value2

User-Agent: Fiddler    
Host: localhost    
Content-Type: application/x-www-form-urlencoded
Timestamp: Thursday, August 02, 2012 3:30:32 PM 
Authentication: cuongle:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=

key1=value1&key3=value3

স্বাক্ষর পেতে হ্যাশ বার্তা

GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n
key1=value1&key2=value2&key3=value3

দয়া করে নোট করুন যে ফর্ম ডেটা এবং ক্যোয়ারী স্ট্রিংটি ক্রমযুক্ত হওয়া উচিত, সুতরাং সার্ভারের কোডটি সঠিক বার্তাটি তৈরি করতে কোয়েরি স্ট্রিং এবং ফর্ম ডেটা পান।

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

অনুরোধে ব্যবহারকারীর নাম সহ ডাটাবেস থেকে গোপন কীটি পাওয়া যায়।

তারপরে সার্ভার কোড অনুরোধে স্বাক্ষরের সাথে স্বাক্ষরের সাথে তুলনা করে; যদি সমান হয় তবে প্রমাণীকরণটি পাস হয়ে যায়, অন্যথায় এটি ব্যর্থ হয়।

স্বাক্ষর তৈরির কোড:

private static string ComputeHash(string hashedPassword, string message)
{
    var key = Encoding.UTF8.GetBytes(hashedPassword.ToUpper());
    string hashString;

    using (var hmac = new HMACSHA256(key))
    {
        var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
        hashString = Convert.ToBase64String(hash);
    }

    return hashString;
}

তাহলে কীভাবে রিপ্লে আক্রমণ রোধ করবেন?

টাইমস্ট্যাম্পের জন্য সীমাবদ্ধতা যুক্ত করুন, এরকম কিছু:

servertime - X minutes|seconds  <= timestamp <= servertime + X minutes|seconds 

(সার্ভারটাইম: অনুরোধের সময়টি সার্ভারে আসবে)

এবং, অনুরোধের স্বাক্ষরকে মেমোরিতে ক্যাশে করুন (মেমোরিচিচি ব্যবহার করুন, সময়ের সীমাতে রাখা উচিত)। পরবর্তী অনুরোধটি যদি আগের অনুরোধের সাথে একই স্বাক্ষর নিয়ে আসে তবে তা প্রত্যাখ্যান করা হবে।

ডেমো কোডটি এখানে দেওয়া হয়েছে: https://github.com/cuongle/Hmac.WebApi


2
@ জেমস: কেবল টাইমস্ট্যাম্পই যথেষ্ট মনে হয় না, খুব অল্প সময়ে তারা অনুরোধটি অনুকরণ করে সার্ভারে প্রেরণ করতে পারে, আমি কেবল আমার পোস্টটি সম্পাদনা করেছি, উভয়ই সর্বোত্তম হবে।
cuongle

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

1
@ ফিলিপস্টাস: মনে হচ্ছে আমি আপনার বক্তব্য পাই না, এখানে ক্যাশে ব্যবহার করার কারণটি হ'ল রিলে আক্রমণ রোধ করা, এর চেয়ে বেশি কিছুই নয়
কিউংল

1
@ ক্রিসো: আপনি [এই পৃষ্ঠাটি] উল্লেখ করতে পারেন ( jokecamp.wordpress.com/2012/10/21/… )। আমি শীঘ্রই এই উত্সটি আপডেট করব
কুওন

1
সমাধানটি প্রস্তাবিত কাজ করে, তবে আপনি ম্যান-ইন-দ্য মিডল আক্রমণকে আটকাতে পারবেন না, এজন্য আপনাকে এইচটিটিপিএস প্রয়োগ করতে হবে
রিফ্যাক্টর

34

আমি প্রথমে সবচেয়ে সরল সমাধান দিয়ে শুরু করার পরামর্শ দেব - সম্ভবত আপনার দৃশ্যে সাধারণ HTTP বেসিক প্রমাণীকরণ + এইচটিটিপিএসই যথেষ্ট।

যদি না হয় (উদাহরণস্বরূপ আপনি https ব্যবহার করতে পারবেন না, বা আরও জটিল কী পরিচালনার প্রয়োজন হয়), আপনার অন্যদের পরামর্শ অনুসারে এইচএমএসি-ভিত্তিক সমাধানগুলি দেখে নিতে পারেন। এই জাতীয় এপিআইয়ের একটি ভাল উদাহরণ হ'ল অ্যামাজন এস 3 ( http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html )

আমি এএসপি.নেট ওয়েব এপিআই তে এইচএমএসি ভিত্তিক প্রমাণীকরণ সম্পর্কে একটি ব্লগ পোস্ট লিখেছিলাম। এটি উভয় ওয়েব এপিআই পরিষেবা এবং ওয়েব এপিআই ক্লায়েন্ট নিয়ে আলোচনা করে কোডটি বিটবাকেটে উপলভ্য। http://www.piotrwalat.net/hmac-authentication-in-asp-net-web-api/

এখানে ওয়েব এপিআই প্রাথমিক প্রমাণীকরণ সম্পর্কে একটি পোস্ট হল: http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-message-handlers/

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

পুনশ্চ. এইচটিটিপিএস + শংসাপত্রগুলি ব্যবহার করার বিকল্প রয়েছে is http://www.piotrwalat.net/client-certificate-authentication-in-asp-net-web-api-and-windows-store-apps/


23

আপনি ডেভডিফাইন্ড.আউথ চেষ্টা করেছেন?

আমি এটি 2-লেগড ওআউথ দিয়ে আমার ওয়েবএপি সুরক্ষিত করতে ব্যবহার করেছি। আমি পিএইচপি ক্লায়েন্টগুলির সাথে এটি সফলভাবেও পরীক্ষা করেছি।

এই লাইব্রেরিটি ব্যবহার করে OAuth এর জন্য সমর্থন যুক্ত করা বেশ সহজ। আপনি কীভাবে এএসপি.নেট এমভিসি ওয়েব API এর সরবরাহকারীর প্রয়োগ করতে পারেন তা এখানে:

1) ডেভডিফাইন্ডের উত্স কোড পান Oআউথ: https://github.com/bittercoder/DevDefined.OAuth - নতুন সংস্করণটি OAuthContextBuilderএক্সটেনসিবিলিটির জন্য অনুমতি দেয় ।

2) গ্রন্থাগারটি তৈরি করুন এবং এটি আপনার ওয়েব এপিআই প্রকল্পে উল্লেখ করুন।

3) এর থেকে প্রসঙ্গ তৈরিতে সমর্থন করার জন্য একটি কাস্টম প্রসঙ্গ বিল্ডার তৈরি করুন HttpRequestMessage:

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Net.Http;
using System.Web;

using DevDefined.OAuth.Framework;

public class WebApiOAuthContextBuilder : OAuthContextBuilder
{
    public WebApiOAuthContextBuilder()
        : base(UriAdjuster)
    {
    }

    public IOAuthContext FromHttpRequest(HttpRequestMessage request)
    {
        var context = new OAuthContext
            {
                RawUri = this.CleanUri(request.RequestUri), 
                Cookies = this.CollectCookies(request), 
                Headers = ExtractHeaders(request), 
                RequestMethod = request.Method.ToString(), 
                QueryParameters = request.GetQueryNameValuePairs()
                    .ToNameValueCollection(), 
            };

        if (request.Content != null)
        {
            var contentResult = request.Content.ReadAsByteArrayAsync();
            context.RawContent = contentResult.Result;

            try
            {
                // the following line can result in a NullReferenceException
                var contentType = 
                    request.Content.Headers.ContentType.MediaType;
                context.RawContentType = contentType;

                if (contentType.ToLower()
                    .Contains("application/x-www-form-urlencoded"))
                {
                    var stringContentResult = request.Content
                        .ReadAsStringAsync();
                    context.FormEncodedParameters = 
                        HttpUtility.ParseQueryString(stringContentResult.Result);
                }
            }
            catch (NullReferenceException)
            {
            }
        }

        this.ParseAuthorizationHeader(context.Headers, context);

        return context;
    }

    protected static NameValueCollection ExtractHeaders(
        HttpRequestMessage request)
    {
        var result = new NameValueCollection();

        foreach (var header in request.Headers)
        {
            var values = header.Value.ToArray();
            var value = string.Empty;

            if (values.Length > 0)
            {
                value = values[0];
            }

            result.Add(header.Key, value);
        }

        return result;
    }

    protected NameValueCollection CollectCookies(
        HttpRequestMessage request)
    {
        IEnumerable<string> values;

        if (!request.Headers.TryGetValues("Set-Cookie", out values))
        {
            return new NameValueCollection();
        }

        var header = values.FirstOrDefault();

        return this.CollectCookiesFromHeaderString(header);
    }

    /// <summary>
    /// Adjust the URI to match the RFC specification (no query string!!).
    /// </summary>
    /// <param name="uri">
    /// The original URI. 
    /// </param>
    /// <returns>
    /// The adjusted URI. 
    /// </returns>
    private static Uri UriAdjuster(Uri uri)
    {
        return
            new Uri(
                string.Format(
                    "{0}://{1}{2}{3}", 
                    uri.Scheme, 
                    uri.Host, 
                    uri.IsDefaultPort ?
                        string.Empty :
                        string.Format(":{0}", uri.Port), 
                    uri.AbsolutePath));
    }
}

4) একটি OAuth সরবরাহকারী তৈরি করার জন্য এই টিউটোরিয়ালটি ব্যবহার করুন: http://code.google.com/p/devdefined-tools/wiki/OAuthProvider । শেষ পদক্ষেপে (সুরক্ষিত উত্সের উদাহরণ অ্যাক্সেস করা) আপনি এই AuthorizationFilterAttributeবৈশিষ্ট্যটি আপনার বৈশিষ্ট্যে ব্যবহার করতে পারেন :

public override void OnAuthorization(HttpActionContext actionContext)
{
    // the only change I made is use the custom context builder from step 3:
    OAuthContext context = 
        new WebApiOAuthContextBuilder().FromHttpRequest(actionContext.Request);

    try
    {
        provider.AccessProtectedResourceRequest(context);

        // do nothing here
    }
    catch (OAuthException authEx)
    {
        // the OAuthException's Report property is of the type "OAuthProblemReport", it's ToString()
        // implementation is overloaded to return a problem report string as per
        // the error reporting OAuth extension: http://wiki.oauth.net/ProblemReporting
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
            {
               RequestMessage = request, ReasonPhrase = authEx.Report.ToString()
            };
    }
}

আমি আমার নিজস্ব সরবরাহকারীর প্রয়োগ করেছি তাই আমি উপরের কোডটি পরীক্ষা করিনি (অবশ্যই WebApiOAuthContextBuilderআমি আমার সরবরাহকারীর মধ্যে যা ব্যবহার করছি) তবে এটি ঠিকঠাক কাজ করা উচিত।


ধন্যবাদ - আমি এটি একবার দেখে নেব, যদিও আপাতত আমি আমার নিজস্ব এইচএমএসি-ভিত্তিক সমাধানটি ঘুরিয়েছি।
ক্রেগ শিয়র

1
@ ক্রেইগশেয়ার - হাই, আপনি বলেছিলেন যে আপনি নিজেরাই রোল করেছেন .. আপনার কিছু ভাগ করে নিতে যদি আপত্তি না মনে করেন তবে কয়েকটি প্রশ্ন ছিল। আমি অনুরূপ অবস্থানে আছি, যেখানে আমার তুলনামূলকভাবে ছোট একটি এমভিসি ওয়েব এপিআই রয়েছে। এপিআই নিয়ন্ত্রণকারীরা অন্যান্য নিয়ামক / ক্রিয়াগুলির পাশাপাশি বসে যা ফর্ম লেখার অধীনে। আমার কাছে ইতিমধ্যে আমি ব্যবহার করতে পারি এমন সদস্যপদ সরবরাহকারী থাকাকালীন OAuth কার্যকর করা একটি ওভারকিল বলে মনে হচ্ছে এবং আমার কেবল কয়েকটি মুখ্য অপারেশন সুরক্ষিত করা দরকার। আমি সত্যিই এমন একটি প্রমাণীকরণ ক্রিয়া চাই যা একটি এনক্রিপ্ট করা টোকেন ফেরত দেয় - তারপরে পরবর্তী কলগুলিতে টোকেনটি ব্যবহার করবে? আমি কোনও বিদ্যমান লেখক সমাধান বাস্তবায়নের প্রতিশ্রুতিবদ্ধ হওয়ার আগে কোনও তথ্য স্বাগত। ধন্যবাদ!
সাম্বোমার্টিন

@ ম্যাকসেমিলিয়ান মাজার - আপনি কীভাবে আরও বিস্তারিতভাবে সরবরাহকারীর প্রয়োগ করেছেন তা আপনি ভাগ করে নিতে পারেন? ক্লায়েন্টকে প্রতিক্রিয়া পাঠাতে আমার কিছু সমস্যা হচ্ছে।
jlrolin

21

[Authorize]সুরক্ষা প্রদানের জন্য ওয়েব এপিআই একটি অ্যাট্রিবিউট চালু করেছে। এটি বিশ্বব্যাপী সেট করা যেতে পারে (Global.asx)

public static void Register(HttpConfiguration config)
{
    config.Filters.Add(new AuthorizeAttribute());
}

বা নিয়ামক প্রতি:

[Authorize]
public class ValuesController : ApiController{
...

অবশ্যই আপনার প্রমাণীকরণের ধরণটি পৃথক হতে পারে এবং আপনি নিজের প্রমাণীকরণ সম্পাদন করতে চাইতে পারেন, যখন এটি ঘটে তখন আপনি অনুমোদনের বৈশিষ্ট্য থেকে উত্তরাধিকার সূচনা পেতে এবং আপনার প্রয়োজনীয়তাগুলি পূরণ করতে এটি বাড়িয়ে নিতে পারেন:

public class DemoAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        if (Authorize(actionContext))
        {
            return;
        }
        HandleUnauthorizedRequest(actionContext);
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
        challengeMessage.Headers.Add("WWW-Authenticate", "Basic");
        throw new HttpResponseException(challengeMessage);
    }

    private bool Authorize(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        try
        {
            var someCode = (from h in actionContext.Request.Headers where h.Key == "demo" select h.Value.First()).FirstOrDefault();
            return someCode == "myCode";
        }
        catch (Exception)
        {
            return false;
        }
    }
}

এবং আপনার নিয়ামক মধ্যে:

[DemoAuthorize]
public class ValuesController : ApiController{

এখানে ওয়েবএপিআই অনুমোদনের জন্য অন্যান্য কাস্টম প্রয়োগের একটি লিঙ্ক রয়েছে:

http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/


@ ডালরজো উদাহরণের জন্য ধন্যবাদ, তবে আমার কিছু সমস্যা আছে। আমি সংযুক্ত লিঙ্কটির দিকে তাকিয়েছিলাম, তবে সেই নির্দেশাবলী অনুসরণ করা বেশ কার্যকর হয় না। আমি প্রয়োজনীয় তথ্য অনুপস্থিতও পেয়েছি। প্রথমত, যখন আমি নতুন প্রকল্পটি তৈরি করি, প্রমাণীকরণের জন্য ব্যক্তিগত ব্যবহারকারীর অ্যাকাউন্টগুলি চয়ন করা কি ঠিক? বা আমি কোনও প্রমাণীকরণ ছাড়াই এটি ছেড়ে দেব। আমি উল্লিখিত 302 ত্রুটিটিও পাচ্ছি না, তবে 401 ত্রুটি পাচ্ছি। শেষ অবধি, আমি কীভাবে আমার দৃষ্টিভঙ্গি থেকে নিয়ন্ত্রণকারীর কাছে প্রয়োজনীয় তথ্য প্রেরণ করব? আমার এজ্যাক্স কলটি দেখতে কেমন হবে? বিটিডব্লিউ, আমি আমার এমভিসি ভিউগুলির জন্য ফর্ম প্রমাণীকরণ ব্যবহার করছি। এটা কি একটা সমস্যা?
আমন্ডা

এটি দুর্দান্তভাবে কাজ করছে। আমাদের নিজস্ব অ্যাক্সেস টোকেনগুলি শিখতে এবং কাজ শুরু করার জন্য কেবল দুর্দান্ত।
কোডনেম 47

একটি ছোট মন্তব্য - সতর্কতা অবলম্বন করুন AuthorizeAttribute, কারণ একই নামের দুটি ভিন্ন শ্রেণি রয়েছে, বিভিন্ন নেমস্পেসে: 1. সিস্টেম.ওয়েব.এমভিসি.অর্টিভাইজ অ্যাট্রিবিউট -> এমভিসি নিয়ন্ত্রণকারীদের জন্য 2. সিস্টেম.ওয়েব.এইচটিপি.অর্টিভাইজ অ্যাট্রিবিউট -> ওয়েবপিপি-র জন্য।
ভিটালিয়া মারকিতানভ

5

আপনি যদি সার্ভারে আপনার এপিআইটিকে সার্ভার ফ্যাশনে সুরক্ষিত করতে চান (2 লেগড প্রমাণীকরণের জন্য ওয়েবসাইটে কোনও পুনঃনির্দেশ নয়)। আপনি OAuth2 ক্লায়েন্ট শংসাপত্রগুলি অনুদান প্রোটোকলটি দেখতে পারেন।

https://dev.twitter.com/docs/auth/application-only-auth

আমি একটি লাইব্রেরি তৈরি করেছি যা আপনাকে সহজেই আপনার ওয়েবএপিআইতে এই ধরণের সমর্থন যোগ করতে সহায়তা করতে পারে। আপনি এটি একটি নিউগেট প্যাকেজ হিসাবে ইনস্টল করতে পারেন:

https://nuget.org/packages/OAuth2ClientCredentialsGrant/1.0.0.0

গ্রন্থাগারটি। নেট ফ্রেমওয়ার্ক 4.5 লক্ষ্য করে।

আপনি একবার আপনার প্রকল্পে প্যাকেজ যুক্ত করলে এটি আপনার প্রকল্পের মূলটিতে একটি রিডমি ফাইল তৈরি করবে। এই প্যাকেজটি কীভাবে কনফিগার / ব্যবহার করতে হয় তা দেখতে আপনি সেই রিডমে ফাইলটি দেখতে পারেন।

চিয়ার্স!


5
আপনি কি এই ফ্রেমওয়ার্কের জন্য সোর্স কোডটি ওপেন সোর্স হিসাবে ভাগ করছেন / সরবরাহ করছেন?
ব্যারিপিকার

জেএফআর: প্রথম লিঙ্কটি হ'ল ভাঙা এবং নুগেট প্যাকেজটি কখনই আপডেট হয়নি
আবদুল কাইয়ুম

3

@ কুওং লে-এর উত্তরের ধারাবাহিকতায়, রিপ্লে আক্রমণ প্রতিরোধ করার জন্য আমার পদ্ধতিটি হবে

// শেয়ারকৃত ব্যক্তিগত কী (বা ব্যবহারকারীর পাসওয়ার্ড) ব্যবহার করে ক্লায়েন্টের পাশে ইউনিক্স সময়টি এনক্রিপ্ট করুন

// এটি সার্ভারে অনুরোধ শিরোনামের অংশ হিসাবে প্রেরণ করুন (WEB API)

// ভাগ করা ব্যক্তিগত কী (বা ব্যবহারকারীর পাসওয়ার্ড) ব্যবহার করে ইউনিক্স টাইম এ সার্ভারে (ডাব্লুইবি এপিআই) ডিক্রিপ্ট করুন

// ক্লায়েন্টের ইউনিক্স সময় এবং সার্ভারের ইউনিক্স সময়ের মধ্যে সময়ের পার্থক্য পরীক্ষা করুন, এক্স সেকেন্ডের চেয়ে বেশি হওয়া উচিত নয়

// যদি ইউজার আইডি / হ্যাশ পাসওয়ার্ড সঠিক হয় এবং ডিক্রিপ্টেড ইউনিক্সটাইম সার্ভার সময়ের x সেকেন্ডের মধ্যে থাকে তবে এটি একটি বৈধ অনুরোধ

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