SORU
18 Temmuz 2012, ÇARŞAMBA


4 Web ASP.NET MVC Üyelik Sağlayıcısı ile API kimlik Doğrulama

ASP.NET MVC 4 Projesi Web API kullanıyorum. Kumandada sınıfı yetki [Yetki] özniteliğini kullanarak gerektirecek şekilde ayarlanmış. Kimlik Doğrulama için ASP.NET Üyelik Sağlayıcısı kullanarak ve benim Web ediyorum.Config "Formlar" kimlik Doğrulaması. kullanacak şekilde ayarlayın Sıkışıp kaldım burada

Her şey harika çalışıyor kadar gelin bitirdim test API ve istediğim için güvenli denetleyicisi [Yetki] özniteliği yani başlangıç testi kimlik doğrulama karşı kullanıcıları benim Üyelik Sağlayıcısı. Ben Fiddler ateş ve aynı çağrı Yetkilendirme:kullanıcı adı:üyelik sağlayıcısı gibi gelen şifre ile birlikte Temel öznitelik ekleme olun:

enter image description here

Aldığım yanıt 401 yetkisiz "" "WWW-kimlik Doğrulaması böyle bir Başlık mevcut." ben Auth altında API SHA1 kodlanmış bir anahtar aradığını fark ettim. Ben bir arama SHA1 jeneratör yangın ve benim için bir karma kullanıcı adı:parola almak ve isteğim böyle Başlık güncelleme:

enter image description here

Bu da işe yaramazsa ve aynı sonuçları alıyorum. Ayrıca belli ki" benim kullanıcı adı/parola. çözmek için sunucu ile kullanmak için "paylaşılan gizli anahtar bir çeşit lazım

Yani benim soru:

  1. Nasıl sunucu (ya da bu durumda Sanal IIS kaçıyor VS 2012) bu anahtarı alıyorum.
  2. Nasıl bu Fiddler kullanıcı adlarını kullanarak kimliği Doğrulanmış çağrı yapmak için kullanın ASP.NET Üyelik Sağlayıcısı/şifreleri.
  3. Nasıl müvekkilim bu uygulama aynı çağrıları (C# WPF Uygulaması) yapmak için.
  4. HTTP telefonlarıma SSL ile birleştiğinde, bu en iyi practive? Ne değildir?

Şimdiden teşekkürler!

CEVAP
18 Temmuz 2012, ÇARŞAMBA


SSL ile basic authentication kullanabilirsiniz. Sunucu tarafında bir özel biz kayıtlı ve geçerli eğer memebership sağlayıcı sorgulayarak kimlik doğrulama, rol almak ve geçerli asıl koyacak olan: işleyicisi temsilci yazabiliriz

public class BasicAuthenticationMessageHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var authHeader = request.Headers.Authorization;

        if (authHeader == null)
        {
            return base.SendAsync(request, cancellationToken);
        }

        if (authHeader.Scheme != "Basic")
        {
            return base.SendAsync(request, cancellationToken);
        }

        var encodedUserPass = authHeader.Parameter.Trim();
        var userPass = Encoding.ASCII.GetString(Convert.FromBase64String(encodedUserPass));
        var parts = userPass.Split(":".ToCharArray());
        var username = parts[0];
        var password = parts[1];

        if (!Membership.ValidateUser(username, password))
        {
            return base.SendAsync(request, cancellationToken);
        }

        var identity = new GenericIdentity(username, "Basic");
        string[] roles = Roles.Provider.GetRolesForUser(username);
        var principal = new GenericPrincipal(identity, roles);
        Thread.CurrentPrincipal = principal;
        if (HttpContext.Current != null)
        {
            HttpContext.Current.User = principal;
        }

        return base.SendAsync(request, cancellationToken);
    }
}

Biz o Application_Start: Bu işleyicisi kaydetmek

GlobalConfiguration.Configuration.MessageHandlers.Add(
    new BasicAuthenticationMessageHandler()
);

Şimdi [Yetki] yalnızca kimliği doğrulanmış kullanıcıların eylemlerini erişim sağlamak için özniteliği ile donatılmış olacak bir Apı denetleyicisi yapabiliriz:

[Authorize]
public class ValuesController : ApiController
{
    public string Get()
    {
        return string.Format("Hello {0}", User.Identity.Name);
    }
}

Tamam, şimdi örnek bir istemci bakalım:

using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;

class Program
{
    static void Main()
    {
        // since for testing purposes I am using IIS Express
        // with an invalid SSL certificate I need to desactivate
        // the check for this certificate.
        ServicePointManager.ServerCertificateValidationCallback  = 
            (sender, certificate, chain, sslPolicyErrors) => true;

        using (var client = new HttpClient())
        {
            var buffer = Encoding.ASCII.GetBytes("john:secret");
            var authHeader = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(buffer));
            client.DefaultRequestHeaders.Authorization = authHeader;
            var task = client.GetAsync("https://localhost:44300/api/values");
            if (task.Result.StatusCode == HttpStatusCode.Unauthorized)
            {
                Console.WriteLine("wrong credentials");
            }
            else
            {
                task.Result.EnsureSuccessStatusCode();
                Console.WriteLine(task.Result.Content.ReadAsAsync<string>().Result);
            }
        }
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ecf150king

    ecf150king

    20 Ocak 2006
  • Paul Schroder

    Paul Schrode

    30 Kasım 2007
  • Techmoan

    Techmoan

    31 Mayıs 2009