2014-11-30 30 views
8

ile ben bir Owin yetkilendirme sunucusu ve ASP.NET Web API'leri açığa birkaç kaynak sunucularını kurdunuz. Her bir kaynak sunucusuna özgü olan yetkilendirme sunucusundan bir JWT hizmeti alıyorum (buradaki fikir, her bir kaynak sunucusunun belirtecine sarılmış özel taleplere gereksinim duymasıdır).kullanın Windows Kimlik OAuth 2.0

Bu sunucular biz tarihsel bir tek oturum açma deneyimi sağlamak için Windows Authentication (Kerberos) kullandık bir intranet ortamında tüm vardır. Bu özellik uygulamamda kayboldu çünkü bir kullanıcı adı belirtmek için kullanıcının kullanıcı adını ve şifresini (AD'ye göre doğrulanmış) kullanıyorum. Tek bir oturum açma deneyimi elde etmenin bir yolu var mı merak ediyorum - belki bir kullanıcı kimliğini belirten bir kullanıcı kimliğini belirlemek için Windows Kimlik Doğrulaması'nı kullanarak?

Bunun bir nevi alışılmışın dışında ve aptalca olabileceğini hissediyorum - bu yüzden lütfen intranet ortamında OAuth 2.0 ile SSO elde etmek için daha iyi ve alternatif bir yaklaşım olup olmadığını söyleyin. Beklediğim gibi

cevap

5

Sonradan anlaşıldı ki, bu kadar zor değildi. Alternatif bir uç noktadan (/token/windows/) bir standart web API denetleyicisi oluşturdum. Bu uç nokta, Windows kullanıcısının bağlanmaya çalıştığı istemci (kaynak) kimliğiyle bir HTTP POST'unu alır. Kimlik oluşturulduğundan emin olmak için eylemin standart [Authorize] özniteliğini koydum, sonra el ile bir talep kimliği oluşturup kullanıcıya bir JWT döndürüyorum. Bu noktadan itibaren kullanıcı standart belirteç yenileme işlemini kullanır.

Düzenleme: Burada bunun altında bir örnek ben hayata neyi temsil ediyor. Bu uygulamanın Windows kimlik doğrulamasını desteklemek için IIS'de yapılandırıldığını unutmayın (anonim kimlik doğrulamaya ek olarak):

[RoutePrefix("token/windows")] 
public class WindowsAuthenticationController : ApiController 
{ 
    [Authorize] 
    [HttpPost] 
    [Route("{client_id}"] 
    public async Task<IHttpActionResult> CreateTokenForWindowsIdentity(string client_id) 
    { 
     var user = User as ClaimsPrincipal; 
     if (user == null) return Unauthorized(); //401 
     var claims = //generate claims based on the User.Identity.Name... 
     var identity = new ClaimsIdentity("JWT"); 
     identity.AddClaims(claims); 

     //manually create JWT using whatever method you prefer, 
     //I used something inspired from http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-api-and-identity-2/ 
    } 
} 
+0

Bir kod örneğiniz veya bunun nasıl yapıldığını gösteren bağlantılar var mı? –

+2

Bu hiç mantıklı ... –

+0

Joshua yapmaz, yetkilendirme sunucusu ve kaynak sunucu, aynı veya farklı? Eğer rol tabanlı bir kaynak sunucu yapıyorsanız, o zaman [Authorize] özniteliğini sarmak, jetonların tüketimi için yapılandırılmış olanla çakışır. "CreateTokenForWindowsIdentity" çağırdığınızda, bu Yetkilendirme özniteliği nedeniyle isteğin geçerli bir belirtecin olmasını bekler. Hem windows auth hem de token based auth'u elde etmek için Resource and Authentication sunucunuzu nasıl mimarleştirdiniz? Thx – nav

İlgili konular