ASP.NET Web API Kimlik Doğrulaması


122

ASP.NET Web API kullanırken bir istemci uygulamasından bir kullanıcının kimliğini doğrulamak istiyorum . Sitedeki tüm videoları izledim ve ayrıca bu forum yazısını okudum .

[Authorize]Özelliği doğru bir şekilde koymak bir 401 Unauthorizeddurum döndürür . Ancak, bir kullanıcının API'da oturum açmasına nasıl izin vereceğimi bilmem gerekiyor.

Bir Android uygulamasından API'ye kullanıcı kimlik bilgileri sağlamak, kullanıcının oturum açmasını sağlamak ve ardından tüm sonraki API çağrılarının önceden kimlik doğrulamasını yaptırmak istiyorum.


Merhaba Mujtaba. Bunu uygulayabildiniz mi?
Vivek Chandraprakash

Başkalarının etki alanından istenmeyen isabetleri önlemek için önce CORS kullanın. Ardından, istekle birlikte geçerli bir Form Kimlik Doğrulaması tanımlama bilgisi gönderin ve son olarak isteği belirteçle yetkilendirin. Bu kombinasyon, web API'nizi her zaman güvenli ve optimize hale getirir.
Majedur Rahaman

Yanıtlar:


137

bir kullanıcının API'ye giriş yapmasına izin ver

Taleple birlikte geçerli bir Form Kimlik Doğrulaması tanımlama bilgisi göndermeniz gerekir. Bu tanımlama bilgisi genellikle LogOn, [FormsAuthentication.SetAuthCookieyöntemi çağırarak kimlik doğrulama ( eylem) sırasında sunucu tarafından gönderilir (bkz. MSDN ).

Bu nedenle müşterinin 2 adımı gerçekleştirmesi gerekir:

  1. LogOnKullanıcı adını ve şifreyi göndererek bir eyleme HTTP isteği gönderin . Sırayla bu eylem FormsAuthentication.SetAuthCookieyöntemi çağıracak (kimlik bilgilerinin geçerli olması durumunda), bu da yanıtta form kimlik doğrulama tanımlama bilgisini ayarlayacaktır.
  2. [Authorize]İlk istekte aldığı form kimlik doğrulama tanımlama bilgisini göndererek korumalı bir eyleme HTTP isteği gönderin .

Bir örnek alalım. Web uygulamanızda tanımlanmış 2 API denetleyiciniz olduğunu varsayalım:

Kimlik doğrulamasından sorumlu ilk kişi:

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;
    }
}

ikincisi ise yalnızca yetkili kullanıcıların görebileceği korumalı eylemleri içerir:

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

Şimdi bu API'yi kullanan bir istemci uygulaması yazabiliriz. İşte önemsiz bir konsol uygulaması örneği ( Microsoft.AspNet.WebApi.Clientve Microsoft.Net.HttpNuGet paketlerini yüklediğinizden emin olun ):

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");
            }
        }
    }
}

Ve işte 2 HTTP isteğinin kablo üzerinde nasıl göründüğü:

Kimlik doğrulama isteği:

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"}

Kimlik doğrulama yanıtı:

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

Korunan veri talebi:

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

Korunan veriler için yanıt:

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"

Android uygulaması için bir oturum sürdürecek mi?
Mujtaba Hassan

Anladım ama lütfen ikinci nokta için örnek bir kod gönderebilir misiniz? Cevabınız için teşekkürler.
Mujtaba Hassan

2
Bir Android HTTP istemcisi yazmak başka bir sorunun konusudur. Sorunuzun konusu olan ASP.NET MVC ve ASP.NET MVC Web API ile ilgisizdir. Çerezleri kullanarak istekleri gönderen bir HTTP istemcisinin nasıl yazılacağını soracağınız Java ve Android ile açıkça etiketlenen yeni bir iş parçacığı başlatmanızı tavsiye ederim.
Darin Dimitrov

Aslında, MVC4 WebApi literatüründe, WebAPI'nin özellikle mobil istemciler için üçüncü taraf istemciler (ve tabii ki öyle) için hedef olduğunu yazmışlardır. Diyelim ki bir masaüstü uygulaması istemcimiz var, lütfen basit bir kod parçacığı gönderebilir misiniz? Teşekkürler
Mujtaba Hassan

2
Ayrıca, HTTP temel kimlik doğrulamasını kullanma hakkındaki şu soruya (ve yanıta) bakın: stackoverflow.com/questions/10987455/…
Jim Harte

12

Örnek olarak android'i alıyorum.

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;
}

Lütfen dikkat : i.localhost kullanılamaz. Android cihazı localhost'a kendisi ana bilgisayar olarak bakar. ii. Web API'sini IIS'de dağıtıyorsa, Form kimlik doğrulaması açılmalıdır.


0

Bu kodu kullanın ve veritabanına erişin

[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) 
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.