ASP.NET Web API 'sinde temel kimlik doğrulamasıBasic Authentication in ASP.NET Web API

, Mike te sonby Mike Wasson

Temel kimlik doğrulaması RFC 2617, http kimlik doğrulaması: temel ve Özet erişimi kimlik doğrulamasıiçinde tanımlanmıştır.Basic authentication is defined in RFC 2617, HTTP Authentication: Basic and Digest Access Authentication.

DezavantajlarDisadvantages

  • Kullanıcı kimlik bilgileri istekte gönderilir.User credentials are sent in the request.
  • Kimlik bilgileri düz metin olarak gönderilir.Credentials are sent as plaintext.
  • Kimlik bilgileri her istekle birlikte gönderilir.Credentials are sent with every request.
  • Tarayıcı oturumunun sonlandırılacağından hariç, oturum açma yöntemi yoktur.No way to log out, except by ending the browser session.
  • Siteler arası istek için güvenlik açığı (CSRF); Anti-CSRF ölçüleri gerektirir.Vulnerable to cross-site request forgery (CSRF); requires anti-CSRF measures.

YararlarıAdvantages

  • Internet standart.Internet standard.
  • Tüm büyük tarayıcılar tarafından desteklenir.Supported by all major browsers.
  • Görece basit protokol.Relatively simple protocol.

Temel kimlik doğrulaması aşağıdaki gibi çalışmaktadır:Basic authentication works as follows:

  1. Bir istek kimlik doğrulaması gerektiriyorsa, sunucu 401 (yetkisiz) döndürür.If a request requires authentication, the server returns 401 (Unauthorized). Yanıt, sunucunun temel kimlik doğrulamasını desteklediğini belirten bir WWW-Authenticate üst bilgisi içerir.The response includes a WWW-Authenticate header, indicating the server supports Basic authentication.
  2. İstemci, yetkilendirme üstbilgisinde istemci kimlik bilgileriyle başka bir istek gönderir.The client sends another request, with the client credentials in the Authorization header. Kimlik bilgileri "ad: parola", Base64 kodlamalı dize olarak biçimlendirilir.The credentials are formatted as the string "name:password", base64-encoded. Kimlik bilgileri şifrelenmedi.The credentials are not encrypted.

Temel kimlik doğrulaması, "bölge" bağlamında gerçekleştirilir.Basic authentication is performed within the context of a "realm." Sunucu, WWW-Authenticate üstbilgisindeki bölge adını içerir.The server includes the name of the realm in the WWW-Authenticate header. Kullanıcının kimlik bilgileri bu bölge içinde geçerli.The user's credentials are valid within that realm. Bir bölgenin tam kapsamı sunucu tarafından tanımlanır.The exact scope of a realm is defined by the server. Örneğin, kaynakları bölümlemek için birkaç bölge tanımlayabilirsiniz.For example, you might define several realms in order to partition resources.

Kimlik Bilgileri şifrelenmemiş olarak gönderildiğinden, temel kimlik doğrulaması yalnızca HTTPS üzerinden güvenlidir.Because the credentials are sent unencrypted, Basic authentication is only secure over HTTPS. Bkz. Web API 'de SSL Ile çalışma.See Working with SSL in Web API.

Temel kimlik doğrulaması da CSRF saldırılarına karşı savunmasızdır.Basic authentication is also vulnerable to CSRF attacks. Kullanıcı kimlik bilgilerini girdikten sonra, tarayıcı otomatik olarak onları oturum süresince aynı etki alanına, sonraki isteklere gönderir.After the user enters credentials, the browser automatically sends them on subsequent requests to the same domain, for the duration of the session. Bu, AJAX isteklerini içerir.This includes AJAX requests. Bkz. siteler arası Istek forgery (CSRF) saldırılarını önleme.See Preventing Cross-Site Request Forgery (CSRF) Attacks.

IIS ile temel kimlik doğrulamasıBasic Authentication with IIS

IIS temel kimlik doğrulamasını destekler, ancak bir desteklenmediği uyarısıyla vardır: kullanıcının kimliği Windows kimlik bilgileriyle doğrulanır.IIS supports Basic authentication, but there is a caveat: The user is authenticated against their Windows credentials. Bu, kullanıcının sunucunun etki alanında bir hesabı olması gerektiği anlamına gelir.That means the user must have an account on the server's domain. Herkese açık bir Web sitesi için genellikle bir ASP.NET üyelik sağlayıcısına göre kimlik doğrulaması yapmak istersiniz.For a public-facing web site, you typically want to authenticate against an ASP.NET membership provider.

IIS kullanarak temel kimlik doğrulamasını etkinleştirmek için, ASP.NET projenizin Web. config dosyasında kimlik doğrulama modunu "Windows" olarak ayarlayın:To enable Basic authentication using IIS, set the authentication mode to "Windows" in the Web.config of your ASP.NET project:

<system.web>
    <authentication mode="Windows" />
</system.web>

Bu modda IIS, kimlik doğrulaması için Windows kimlik bilgilerini kullanır.In this mode, IIS uses Windows credentials to authenticate. Ayrıca, IIS 'de temel kimlik doğrulamasını etkinleştirmeniz gerekir.In addition, you must enable Basic authentication in IIS. IIS Yöneticisi 'nde Özellikler Görünümü ' ne gidin, kimlik doğrulaması ' nı seçin ve temel kimlik doğrulamasını etkinleştirin.In IIS Manager, go to Features View, select Authentication, and enable Basic authentication.

Web API projenizde, kimlik doğrulaması gerektiren herhangi bir denetleyici eylemi için [Authorize] özniteliğini ekleyin.In your Web API project, add the [Authorize] attribute for any controller actions that need authentication.

İstemci, istekteki yetkilendirme üst bilgisini ayarlayarak kimliğini doğrular.A client authenticates itself by setting the Authorization header in the request. Tarayıcı istemcileri bu adımı otomatik olarak gerçekleştirir.Browser clients perform this step automatically. Tarayıcı olmayan istemcilerin üstbilgiyi ayarlaması gerekir.Nonbrowser clients will need to set the header.

Özel üyelikle temel kimlik doğrulamasıBasic Authentication with Custom Membership

Belirtildiği gibi, IIS 'de yerleşik olarak bulunan temel kimlik doğrulaması Windows kimlik bilgilerini kullanır.As mentioned, the Basic Authentication built into IIS uses Windows credentials. Bu, barındırma sunucusunda kullanıcılarınız için hesap oluşturmanız gerektiği anlamına gelir.That means you need to create accounts for your users on the hosting server. Ancak, bir Internet uygulaması için Kullanıcı hesapları genellikle bir dış veritabanında depolanır.But for an internet application, user accounts are typically stored in an external database.

Aşağıdaki kod, temel kimlik doğrulaması gerçekleştiren bir HTTP modülünü kullanır.The following code how an HTTP module that performs Basic Authentication. Bu örnekte sözde bir yöntem olan CheckPassword yöntemini değiştirerek, bir ASP.NET üyelik sağlayıcısını kolayca takabilirsiniz.You can easily plug in an ASP.NET membership provider by replacing the CheckPassword method, which is a dummy method in this example.

Web API 2 ' de, bir HTTP modülü yerine bir kimlik doğrulama filtresi veya owın ara yazılımıyazmayı düşünmelisiniz.In Web API 2, you should consider writing an authentication filter or OWIN middleware, instead of an HTTP module.

namespace WebHostBasicAuth.Modules
{
    public class BasicAuthHttpModule : IHttpModule
    {
        private const string Realm = "My Realm";

        public void Init(HttpApplication context)
        {
            // Register event handlers
            context.AuthenticateRequest += OnApplicationAuthenticateRequest;
            context.EndRequest += OnApplicationEndRequest;
        }

        private static void SetPrincipal(IPrincipal principal)
        {
            Thread.CurrentPrincipal = principal;
            if (HttpContext.Current != null)
            {
                HttpContext.Current.User = principal;
            }
        }

        // TODO: Here is where you would validate the username and password.
        private static bool CheckPassword(string username, string password)
        {
            return username == "user" && password == "password";
        }

        private static void AuthenticateUser(string credentials)
        {
            try
            {
                var encoding = Encoding.GetEncoding("iso-8859-1");
                credentials = encoding.GetString(Convert.FromBase64String(credentials));

                int separator = credentials.IndexOf(':');
                string name = credentials.Substring(0, separator);
                string password = credentials.Substring(separator + 1);

                if (CheckPassword(name, password))
                {
                    var identity = new GenericIdentity(name);
                    SetPrincipal(new GenericPrincipal(identity, null));
                }
                else
                {
                    // Invalid username or password.
                    HttpContext.Current.Response.StatusCode = 401;
                }
            }
            catch (FormatException)
            {
                // Credentials were not formatted correctly.
                HttpContext.Current.Response.StatusCode = 401;
            }
        }

        private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
        {
            var request = HttpContext.Current.Request;
            var authHeader = request.Headers["Authorization"];
            if (authHeader != null)
            {
                var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);

                // RFC 2617 sec 1.2, "scheme" name is case-insensitive
                if (authHeaderVal.Scheme.Equals("basic",
                        StringComparison.OrdinalIgnoreCase) &&
                    authHeaderVal.Parameter != null)
                {
                    AuthenticateUser(authHeaderVal.Parameter);
                }
            }
        }

        // If the request was unauthorized, add the WWW-Authenticate header 
        // to the response.
        private static void OnApplicationEndRequest(object sender, EventArgs e)
        {
            var response = HttpContext.Current.Response;
            if (response.StatusCode == 401)
            {
                response.Headers.Add("WWW-Authenticate",
                    string.Format("Basic realm=\"{0}\"", Realm));
            }
        }

        public void Dispose() 
        {
        }
    }
}

HTTP modülünü etkinleştirmek için, System. webserver bölümündeki Web. config dosyanıza aşağıdakileri ekleyin:To enable the HTTP module, add the following to your web.config file in the system.webServer section:

<system.webServer>
    <modules>
      <add name="BasicAuthHttpModule" 
        type="WebHostBasicAuth.Modules.BasicAuthHttpModule, YourAssemblyName"/>
    </modules>

"YourAssemblyName" öğesini derlemenin adıyla değiştirin ("dll" uzantısını dahil değil).Replace "YourAssemblyName" with the name of the assembly (not including the "dll" extension).

Formlar veya Windows kimlik doğrulaması gibi diğer kimlik doğrulama düzenlerini devre dışı bırakmanız gerekir.You should disable other authentication schemes, such as Forms or Windows auth.