web-gelistirme-sc.com

ASP.NET Web API'sinde Kullanıcı Doğrulama

Bu konu benim için inanılmaz derecede kafa karıştırıcıydı. HTTP uygulamalarında bir çaylak değilim ama JSON verilerini bir yerden kullanan bir iPhone istemcisi geliştirmem gerekiyor. Web API’yi MS’den seçtim çünkü yeterince kolay görünüyordu, ancak kullanıcıların kimliklerini doğrulama konusunda işler biraz sinir bozucu hale geldi.

Birkaç saatlik Googling işleminden sonra Authorize metodlarım üzerinde ApiController özniteliğini kullanmaya kadar bir kullanıcının oturum açma ekranından aşağı doğru nasıl kimlik doğrulaması yapılacağına dair net bir örnek bulamadığım için şaşırdım.

Bu bir soru değil, bunun tam olarak nasıl yapılacağına ilişkin bir örnek için bir istek. Aşağıdaki sayfalara baktım:

Bunlar, yetkisiz taleplerin nasıl ele alınacağını açıklasa da, bunlar bir LoginController gibi bir şey veya kullanıcı kimlik bilgileri istemek ve bunları doğrulamak için böyle bir şey açıkça göstermezler.

Güzel bir basit örnek yazmak isteyen ya da beni doğru yöne işaret eden herkes lütfen?

Teşekkürler.

147
Luis Aguilar

Birkaç saat süren Googling'den sonra ApiController yöntemleri üzerinde Yetkilendirme özelliğini kullanarak ApiController yöntemleri üzerinde bir kullanıcının doğrudan doğruya nasıl doğrulanacağına dair net bir örnek bulamadığım için şaşırdım.

Çünkü bu iki kavram hakkında kafanız karışıyor:

  • Kimlik doğrulama, sistemlerin kullanıcılarını güvenli bir şekilde tanımlayabildiği mekanizmadır. Kimlik doğrulama sistemleri, sorulara cevaplar sağlar:

    • Kullanıcı kim?
    • Kullanıcı, kendisini temsil ettiği kişi gerçekten midir?
  • Yetkilendirme, bir sistemin belirli bir kimliği doğrulanmış kullanıcının, sistem tarafından kontrol edilen kaynakları güvence altına almak için hangi erişim seviyesine sahip olması gerektiğini belirlediği mekanizmadır. Örneğin, bir veri tabanı yönetim sistemi, belirli kişilere bir veri tabanından bilgi alma kabiliyetine sahip olan fakat veri tabanında depolanan verileri değiştirme kabiliyetini vermeyecek, diğerlerine veri değiştirme kabiliyetini sağlayacak şekilde tasarlanabilir. Yetkilendirme sistemleri, sorulara cevaplar sağlar:

    • X kullanıcısı R kaynağına erişmeye yetkili mi?
    • X kullanıcısı P işlemini gerçekleştirmeye yetkili mi?
    • X kullanıcısı, R kaynağında P işlemini gerçekleştirmeye yetkili mi?

MVC'deki Authorize niteliği erişim kurallarını uygulamak için kullanılır, örneğin:

 [System.Web.Http.Authorize(Roles = "Admin, Super User")]
 public ActionResult AdministratorsOnly()
 {
     return View();
 }

Yukarıdaki kural yalnızca Admin ve Süper Kullanıcı rollerinde bulunan kullanıcıların yönteme erişmesine izin verir

Bu kurallar, location öğesi kullanılarak web.config dosyasında da ayarlanabilir. Örnek:

  <location path="Home/AdministratorsOnly">
    <system.web>
      <authorization>
        <allow roles="Administrators"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>

Ancak, bu yetkilendirme kuralları uygulanmadan önce, geçerli web sitesine kimliği doğrulanmış olmanız gerekir.

Bunlar yetkisiz taleplerin nasıl ele alınacağını açıklasalar bile, bunlar bir LoginController gibi bir şeyi veya kullanıcı kimlik bilgilerini istemek ve bunları doğrulamak için böyle bir şeyi açıkça göstermezler.

Buradan, sorunu ikiye bölebiliriz:

  • Aynı Web uygulamasında Web API servislerini kullanırken kullanıcıları doğrulayın

    Bu en basit yaklaşım olacaktır çünkü --- ASP.Net'te Kimlik Doğrulama

    Bu basit bir örnek:

    Web.config

    <authentication mode="Forms">
      <forms
        protection="All"
        slidingExpiration="true"
        loginUrl="account/login"
        cookieless="UseCookies"
        enableCrossAppRedirects="false"
        name="cookieName"
      />
    </authentication>
    

    Kullanıcılar hesap/login yoluna yönlendirilecek, orada kullanıcı kimlik bilgilerini istemek için özel kontroller yapacaksınız ve ardından aşağıdakileri kullanarak kimlik doğrulama çerezini ayarlayacaksınız:

        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    
  • Çapraz platform kimlik doğrulaması

    Bu durumda yalnızca yalnızca Web uygulaması içindeki Web API hizmetlerini gösterme bu nedenle, hizmetleri kullanan başka bir müşteriniz olur, müşteri başka bir Web uygulaması veya herhangi bir .Net uygulaması olabilir (Win Forms, WPF, konsol, Windows hizmeti vb.)

    Örneğin, Web API hizmetini aynı ağ etki alanındaki (intranet içinde) başka bir web uygulamasından kullanacağınızı varsayalım, bu durumda ASP.Net tarafından sağlanan Windows kimlik doğrulamasına güvenebilirsiniz.

    <authentication mode="Windows" />
    

    Servisleriniz İnternete maruz kalırsa, kimliği doğrulanmış belirteçleri her bir Web API servisine aktarmanız gerekir.

    Daha fazla bilgi için, aşağıdaki makalelerden yararlanın:

176
Jupaol

Bir yetkilendirme çerezi olmadan bir kullanıcı adı ve şifresine ve kimlik doğrulaması yapmak istiyorsanız , MVC4 Authorize niteliği kutunun dışında çalışmaz. Ancak, temel kimlik doğrulama başlıklarını kabul etmek için denetleyicinize aşağıdaki yardımcı yöntemi ekleyebilirsiniz. Kontrol cihazınızın yöntemlerinin başından itibaren arayın.

void EnsureAuthenticated(string role)
{
    string[] parts = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(Request.Headers.Authorization.Parameter)).Split(':');
    if (parts.Length != 2 || !Membership.ValidateUser(parts[0], parts[1]))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "No account with that username and password"));
    if (role != null && !Roles.IsUserInRole(parts[0], role))
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "An administrator account is required"));
}

İstemci tarafından, bu yardımcı, kimlik doğrulama başlığı yerinde olduğunda HttpClient oluşturur:

static HttpClient CreateBasicAuthenticationHttpClient(string userName, string password)
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(userName + ':' + password)));
    return client;
}
15
Edward Brey

Bir MVC5/Web API projesi üzerinde çalışıyorum ve Web Api yöntemleri için yetki alabilmem gerekiyordu. Dizin görünümüm ilk yüklendiğinde, otomatik olarak oluşturulduğuna inandığım 'token' Web API yöntemine çağrı yapıyorum.

Belirteci almak için istemci tarafı kodu (CoffeeScript):

getAuthenticationToken = (username, password) ->
    dataToSend = "username=" + username + "&password=" + password
    dataToSend += "&grant_type=password"
    $.post("/token", dataToSend).success saveAccessToken

Başarılı olursa, aşağıdakiler çağrılır ve bu kimlik doğrulama belirtecini yerel olarak kaydeder:

saveAccessToken = (response) ->
    window.authenticationToken = response.access_token

Sonra [Yetki] etiketine sahip bir Web API yöntemine Ajax çağrısı yapmam gerekirse, Ajax çağrım için aşağıdaki başlığı ekliyorum:

{ "Authorization": "Bearer " + window.authenticationToken }
9
ProfNimrod