2015-07-15 16 views
12

Bunun mümkün olduğundan emin olun, ancak nasıl elde edileceğinden emin değilsiniz. Şu anda kullanıcı adı ve parola kabul eden bir OWIN OAUTH uygulaması var ve onları bir veritabanına karşı doğrular. SmartCard ile tek oturum açmayı desteklemek için bir SmartCard Uid uygulamasından geçmek için bunu genişletmek istiyorum.owin oauth ek parametreler gönderin

OWIN girişinde ek parametreler geçirebilir miyim, eğer öyleyse nasıl? Temel öneri, bir kullanıcının bir kullanıcı adı/şifre kombinasyonu ile giriş yapabilmesi veya bir SmartCard kullanıcı kimliği (eğer bir SmartCard kullanıcı arayüzünden geçiyorsa ve bu uygulama veritabanında bulunursa, uygulama kullanıcı girişi yapar)

Şu an username, password ve grant_type ve bu listeye uid eklemek ve bunu benim AuthorizationServiceProvider'umdan kaldırmak istiyorum.

Ben OAuthGrantResourceOwnerCredentialsContext üzerinde UserName, Password ve ClientId görebilirsiniz ama ben başarmak ne çalışıyorum destek vereceğini başka özelliklerini göremez.

Bu

Şu anda benim servis sağlayıcı ben de bağlamdan UID elde edebilmek istiyorum ama yine de bunu gerçekleştirmenin göremiyorum

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

     var user = await this._userService.FindUser(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 

     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
     identity.AddClaim(new Claim(ClaimTypes.Sid, user.Id.ToString())); 
     identity.AddClaim(new Claim(ClaimTypes.Role, "user")); 
     identity.AddClaim(new Claim("sub", context.UserName)); 

     var secretKeyBytes = Encoding.UTF8.GetBytes(user.PasswordHash); 
     var props = 
      new AuthenticationProperties(
       new Dictionary<string, string> 
        { 
         { "dm:appid", user.Id.ToString() }, 
         { "dm:apikey", Convert.ToBase64String(secretKeyBytes) } 
        }); 

     var ticket = new AuthenticationTicket(identity, props); 
     context.Validated(ticket); 
    } 

içinde ne var, herhangi bir yardım büyük beğeni topluyor.

cevap

29

Henüz yapmadıysanız, ValidateClientAuthentication uygulamalısınız.

İstemcinizi doğrulamanız gereken yer burasıdır. Bu yöntemde, istemcinizin bir tür onayını yapacaksınız ve GrantResourceOwnerCredentials'da okunabilecek nesneleri/değişkeni ayarlayacaksınız.

Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 

yetkilendirme sunucusuna gönderirken ek alan (lar) geçmesini içeren bir OAuthValidateClientAuthenticationContext alır. Ben 4 pozisyonda ekstra parametre uid ekledik Yukarıdaki resimde

enter image description here

.

Eğer bağlam doğrulamak önce: Eğer değişken/nesne ayarlayabilirsiniz

context.Validated(clientId); 

:

string uid = context.Parameters.Where(f => f.Key == "uid").Select(f => f.Value).SingleOrDefault()[0]; 
context.OwinContext.Set<string>("SmartCard", uid); 

Şimdi, senin GrantResourceOwnerCredentials sadece değerini okumak ve kullanabilirsiniz in:

string uid = context.OwinContext.Get<string>("SmartCard"); 

Daha fazla bilgi edinmek isterseniz, bu github'a bir göz atabilirsinizEğer bir javascript/jquery istemcisi ile test edebilirsiniz bütün çözüm indirirseniz

context.OwinContext.Set<ApplicationClient>("oauth:client", client); 

: Ben bir nesne geçmek.

+0

Mükemmel teşekkürler, ilk etapta geçirilmediyse parametreyi okumak için hafif bir değişiklik yaptı, tam olarak aradığım şeyden başka, teşekkürler –

+0

Sevindim Neil'e yardım ettim. – LeftyX

+0

@LeftyX Merhaba. client_credentials kullanarak kendi oauth sunucumu yazmaya çalışıyorum. Ama aralarında sıkışıp kaldım. biraz yardım alabilir miyim? https://github.com/koushiksaha89/oauthserver – user3132179

İlgili konular