0

Web Api'de Giriş ve Kayıt için In-Build şablonunu kullanıyorum.Web api ile Temel Kimlik Doğrulama Giriş

Token tabanlı kimlik doğrulaması kullanır.

Ama ne istediğim şimdi API yöntemleri çağırmak için bu kullanmak istiyorum o zaman bir simge dönecektir web API sonra Temel kimlik doğrulamasını kullanmak istediğiniz bir kullanıcı, giriş etmektir.

şimdi ben bu

var resp = $http({ 
      url: "/TOKEN", 
      method: "POST", 
      data: $.param({ grant_type: 'password', username: userlogin.username, password: userlogin.password }), 
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, 
     }); 

gibi giriş için talep ve Ben yöntemleri yetki çağırmak için bir sonraki isteği ile göndermek, hangi bana jeton dönün.

Ama adını ve şifresini göndermek için değnek: temel kimlik

HttpClient client = new HttpClient(); 

string authInfo = "admin" + ":" + "123456"; 
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authInfo); 

client.BaseAddress = new Uri("http://localhost:63173/TOKEN"); 

Ve sunucu tarafında gibi ayrılan ben kullanıcıyı doğrulamak için kullanıcı adı ve şifre almak için geri deşifre edecek ve doğrulama işaretini dönecektir.

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

Ancak varolan kodu nerede değiştireceğimi bilmiyorum. Aklıma

+0

Sunucu tarafı size 'Microsoft.Owin.Security.OAuth' ve' app.UseOAuthAuthorizationServer' kullanıyorsunuz? –

cevap

0

tek geçici çözüm Owin boru hattının başında infaz alanları oluşturmak üzere Yetkilendirme başlığında bulunan kimlik bilgilerini remaps basit Owin ortakatmanını yazıyor. Buna benzer

şey:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.Use(async (ctx, n) => 
     { 
      if (ctx.Request.Path == new PathString("/path/to/token")) //the same path you specified in the "TokenEndpointPath" property of "OAuthAuthorizationServerOptions" 
      { 
       var authHeader = ctx.Request.Headers["Authorization"]; 

       if (!string.IsNullOrWhiteSpace(authHeader) && authHeader.StartsWith("Basic ")) 
       { 
        //parse here authHeader 
        var name = GetUsernameFromHeader(authHeader); 
        var password = GetPasswordFromHeader(authHeader); 
        //change the above lines with your parsing methods 

        var form = new Dictionary<string, string[]>() 
        { 
         { "grant_type", new [] {"password" }}, 
         { "username", new []{ name }}, 
         { "password", new [] { password}} 
        }; 

        ctx.Set<IFormCollection>("Microsoft.Owin.Form#collection", new FormCollection(form)); 
       } 
      } 

      await n.Invoke(); 
     }); 


     //app.UseWebApi... 
     //other middlewares 
    } 
} 

ben bu yaklaşım sadece Owin bağlamında bu değerleri yazar ve değişmez yatan OAuthAuthorizationServerMiddleware uygulanması sürece çalışacağını uyarıyorum.

+0

Ancak, 'GrantResourceOwnerCredentials' yönteminde 'context.ClientId 'öğesine erişmeye çalıştığımda null verir. Bu "StartUp" ı bu gibi ayarladıktan sonra, yeni {] client_id ", yeni [] {clientId}}'. Ayrıca, Temel Kimlik Doğrulama'da clientId gönderiyorum. – Programmer

+0

Sorunu, client_id'den hiç bahsetmedim. Eğer ayrıştırmak ve (örneğin OAuthValidateClientAuthenticationContext' 'üzerinde TryGetFormCredentials' yöntemi' kullanarak) 'OnValidateClientAuthentication' özelliği sağlayarak ilk doğrulamak etmezseniz GrantResourceOwnerCredentials'' de bağlamdan CLIENT_ID alınamıyor. –

+0

Çok teşekkür ederim. ClientId'yi nasıl ayarlayacağımı anladım. ValidateClientAuthentication' yönteminde var getClient = context.Parameters ["client_id"]; context.OwinContext.Set ("as: client_Id", clientId); context.Validated (clientId); "context.ClientId" i elde edemiyorum – Programmer