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:
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:
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:
- Nasıl sunucu (ya da bu durumda Sanal IIS kaçıyor VS 2012) bu anahtarı alıyorum.
- 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.
- Nasıl müvekkilim bu uygulama aynı çağrıları (C# WPF Uygulaması) yapmak için.
- HTTP telefonlarıma SSL ile birleştiğinde, bu en iyi practive? Ne değildir?
Şimdiden teşekkürler!
CEVAP
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);
}
}
}
}
Nasıl tarayıcı gizlensin'kimlik d...
Bir sitede SADECE Openıd kimlik doğrul...
Kimlik doğrulama aracı için bağlantı a...
ASP.NET Web API kimlik Doğrulama...
Kimlik doğrulama ve yetkilendirme aras...