ASP.NET ওয়েব API প্রমাণীকরণ


122

আমি এএসপি.নেট ওয়েব এপিআই ব্যবহার করার সময় ক্লায়েন্ট অ্যাপ্লিকেশন থেকে একজন ব্যবহারকারীকে প্রমাণীকরণ করতে চাই । আমি সাইটে সমস্ত ভিডিও দেখেছি এবং এই ফোরাম পোস্টটিও পড়েছি ।

ফেলে [Authorize]অ্যাট্রিবিউট সঠিকভাবে একটি ফেরৎ 401 Unauthorizedঅবস্থা। তবে, আমাকে কীভাবে একজন ব্যবহারকারীকে এপিআইতে লগ ইন করতে দেওয়া যায় তা জানতে হবে।

আমি একটি এন্ড্রয়েড অ্যাপ্লিকেশন থেকে এপিআইতে ব্যবহারকারীর শংসাপত্র সরবরাহ করতে, ব্যবহারকারীকে লগ ইন করতে এবং তারপরে সমস্ত এপিআই কলগুলি পূর্ব-প্রমাণীকরণ করতে চাই।


হাই মুজতবা। আপনি কি এটি বাস্তবায়ন করতে পেরেছিলেন?
বিবেক চন্দ্রপ্রকাশ

অন্যের ডোমেন থেকে অযাচিত হিট প্রতিরোধ করতে প্রথমে CORS ব্যবহার করুন। তারপরে অনুরোধের সাথে একটি বৈধ ফর্ম প্রমাণীকরণ কুকি প্রেরণ করুন এবং অবশেষে টোকেনের মাধ্যমে অনুরোধ অনুমোদিত করুন। এই সমন্বয়টি আপনার ওয়েব এপিআইকে সর্বদা সুরক্ষিত এবং অনুকূলিত করে তোলে।
মাজেদুর রাহমান

উত্তর:


137

কোনও ব্যবহারকারীকে API এ লগ ইন করার অনুমতি দিন

অনুরোধের সাথে আপনাকে একটি বৈধ ফর্ম প্রমাণীকরণ কুকি প্রেরণ করতে হবে। এই কুকিটি সাধারণত পদ্ধতিতে LogOnকল করে ( ক্রিয়া) প্রমাণীকরণের সময় সার্ভারের মাধ্যমে প্রেরণ করা হয় [FormsAuthentication.SetAuthCookie(দেখুন এমএসডিএন )।

সুতরাং ক্লায়েন্টের 2 টি পদক্ষেপ করা দরকার:

  1. LogOnব্যবহারকারীর নাম এবং পাসওয়ার্ড প্রেরণ করে একটি ক্রিয়াতে একটি HTTP অনুরোধ প্রেরণ করুন। পরিবর্তে এই ক্রিয়াটি সেই FormsAuthentication.SetAuthCookieপদ্ধতিতে কল করবে (যদি শংসাপত্রগুলি বৈধ হয়) যা প্রতিক্রিয়ায় ফর্মগুলি প্রমাণীকরণ কুকি সেট করবে।
  2. [Authorize]প্রথম অনুরোধে এটি পুনরুদ্ধার করা ফর্ম প্রমাণীকরণ কুকি প্রেরণ করে একটি সুরক্ষিত ক্রিয়ায় একটি HTTP অনুরোধ প্রেরণ করুন।

একটি উদাহরণ নেওয়া যাক। মনে করুন যে আপনার ওয়েব অ্যাপ্লিকেশনে 2 টি এপিআই কন্ট্রোলার সংজ্ঞায়িত রয়েছে:

প্রমাণীকরণ হ্যান্ডেল করার জন্য প্রথম একজন দায়ী:

public class AccountController : ApiController
{
    public bool Post(LogOnModel model)
    {
        if (model.Username == "john" && model.Password == "secret")
        {
            FormsAuthentication.SetAuthCookie(model.Username, false);
            return true;
        }

        return false;
    }
}

এবং দ্বিতীয়টি সুরক্ষিত ক্রিয়াযুক্ত যা কেবল অনুমোদিত ব্যবহারকারীরা দেখতে পাবেন:

[Authorize]
public class UsersController : ApiController
{
    public string Get()
    {
        return "This is a top secret material that only authorized users can see";
    }
}

এখন আমরা এই এপিআই গ্রাহক একটি ক্লায়েন্ট অ্যাপ্লিকেশন লিখতে পারে। এখানে একটি তুচ্ছ কনসোল অ্যাপ্লিকেশন উদাহরণ (নিশ্চিত করুন যে আপনি Microsoft.AspNet.WebApi.Clientএবং Microsoft.Net.Httpনিউগেট প্যাকেজ ইনস্টল করেছেন ):

using System;
using System.Net.Http;
using System.Threading;

class Program
{
    static void Main()
    {
        using (var httpClient = new HttpClient())
        {
            var response = httpClient.PostAsJsonAsync(
                "http://localhost:26845/api/account", 
                new { username = "john", password = "secret" }, 
                CancellationToken.None
            ).Result;
            response.EnsureSuccessStatusCode();

            bool success = response.Content.ReadAsAsync<bool>().Result;
            if (success)
            {
                var secret = httpClient.GetStringAsync("http://localhost:26845/api/users");
                Console.WriteLine(secret.Result);
            }
            else
            {
                Console.WriteLine("Sorry you provided wrong credentials");
            }
        }
    }
}

এবং 2 টি এইচটিপি অনুরোধগুলি তারের দিকে কীভাবে দেখায় তা এখানে রয়েছে:

প্রমাণীকরণের অনুরোধ:

POST /api/account HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: localhost:26845
Content-Length: 39
Connection: Keep-Alive

{"username":"john","password":"secret"}

প্রমাণীকরণের প্রতিক্রিয়া:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Set-Cookie: .ASPXAUTH=REMOVED FOR BREVITY; path=/; HttpOnly
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 4
Connection: Close

true

সুরক্ষিত ডেটার জন্য অনুরোধ:

GET /api/users HTTP/1.1
Host: localhost:26845
Cookie: .ASPXAUTH=REMOVED FOR BREVITY

সুরক্ষিত ডেটার জন্য প্রতিক্রিয়া:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 66
Connection: Close

"This is a top secret material that only authorized users can see"

এটি কি অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির জন্য একটি অধিবেশন বজায় রাখতে চলেছে?
মুজতবা হাসান

পয়েন্টটি পেয়েছেন তবে আপনি দয়া করে দ্বিতীয় পয়েন্টের জন্য একটি নমুনা কোড পোস্ট করতে পারেন। আপনার উত্তরের জন্য ধন্যবাদ.
মুজতবা হাসান

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

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

2
এইচটিটিপি মৌলিক প্রমাণীকরণ ব্যবহার সম্পর্কে এই প্রশ্নটি (এবং উত্তর) দেখুন: স্ট্যাকওভারফ্লো
জিম হার্ট

12

আমি উদাহরণ হিসাবে অ্যান্ড্রয়েড নিতে।

public abstract class HttpHelper {

private final static String TAG = "HttpHelper";
private final static String API_URL = "http://your.url/api/";

private static CookieStore sCookieStore;

public static String invokePost(String action, List<NameValuePair> params) {
    try {
        String url = API_URL + action + "/";
        Log.d(TAG, "url is" + url);
        HttpPost httpPost = new HttpPost(url);
        if (params != null && params.size() > 0) {
            HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
            httpPost.setEntity(entity);
        }
        return invoke(httpPost);
    } catch (Exception e) {
        Log.e(TAG, e.toString());
    }

    return null;
}

public static String invokePost(String action) {
    return invokePost(action, null);
}

public static String invokeGet(String action, List<NameValuePair> params) {
    try {
        StringBuilder sb = new StringBuilder(API_URL);
        sb.append(action);
        if (params != null) {
            for (NameValuePair param : params) {
                sb.append("?");
                sb.append(param.getName());
                sb.append("=");
                sb.append(param.getValue());
            }
        }
        Log.d(TAG, "url is" + sb.toString());
        HttpGet httpGet = new HttpGet(sb.toString());
        return invoke(httpGet);
    } catch (Exception e) {
        Log.e(TAG, e.toString());
    }

    return null;
}

public static String invokeGet(String action) {
    return invokeGet(action, null);
}

private static String invoke(HttpUriRequest request)
        throws ClientProtocolException, IOException {
    String result = null;
    DefaultHttpClient httpClient = new DefaultHttpClient();

    // restore cookie
    if (sCookieStore != null) {
        httpClient.setCookieStore(sCookieStore);
    }

    HttpResponse response = httpClient.execute(request);

    StringBuilder builder = new StringBuilder();
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            response.getEntity().getContent()));
    for (String s = reader.readLine(); s != null; s = reader.readLine()) {
        builder.append(s);
    }
    result = builder.toString();
    Log.d(TAG, "result is ( " + result + " )");

    // store cookie
    sCookieStore = ((AbstractHttpClient) httpClient).getCookieStore();
    return result;
}

মনোযোগ দিন please i.localhost ব্যবহার করা যাবে না। অ্যান্ড্রয়েড ডিভাইস লোকালহোস্টকে নিজের হোস্ট হিসাবে দেখায়। ii.II আইআইএস-এ যদি ওয়েব এপিআই স্থাপন করে তবে অবশ্যই ফর্ম প্রমাণীকরণটি খুলতে হবে।


0

এই কোডটি ব্যবহার করুন এবং ডাটাবেস অ্যাক্সেস করুন

[HttpPost]
[Route("login")]
public IHttpActionResult Login(LoginRequest request)
{
       CheckModelState();
       ApiResponse<LoginApiResponse> response = new ApiResponse<LoginApiResponse>();
       LoginResponse user;
       var count = 0;
       RoleName roleName = new RoleName();
       using (var authManager = InspectorBusinessFacade.GetAuthManagerInstance())
       {
           user = authManager.Authenticate(request); 
       } reponse(ok) 
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.