2016-04-08 23 views
1

IDS3'ü CookieAuthentication kullanan OWIN'ye geçirdiğim eski bir MVC uygulamasına entegre etme görevini üstlendim. Muhteşem örnekler projesiyle, özel bir kullanıcı hizmeti, özel giriş sayfası ve kod akış testi istemcisi ile çalışan basit bir kurulum almayı başardım.Mevcut bir çerez kimlik doğrulamasının Kimlik durumunu özel bir giriş sayfasında kullanma

Şu anda bu gereksinimi çözmeye çalışıyorum: Bir kullanıcı zaten varolan tanımlama bilgisi kimlik doğrulaması yoluyla oturum açtıysa ve sınama istemcimiz aracılığıyla bir kod akışını başlatırsa, bunları otomatik olarak IDS3'e giriş yapmaları istenir; tekrar kimlik bilgileri. Ben tanımlama bilgisi kimlik üzerinden bir kullanıcı olarak giriş yaparsanız

[Route("identity/logintest", Name = "ids3-login")] 
public ActionResult IdsLogin(string id) 
{ 
    var ctx = Request.GetOwinContext(); 
    var user = ctx.Authentication.User; 

    // If they're already logged in via cookie auth, automatically 
    // log them in to IDS3 and send them on their way 
    if (user.Identity.IsAuthenticated) 
    { 
     var env = ctx.Environment; 

     env.IssueLoginCookie(new IdentityServer3.Core.Models.AuthenticatedLogin 
     { 
      Subject = User.Identity.Name, 
      Name = User.Identity.Name, 
     }); 

     var msg = env.GetSignInMessage(id); 
     var returnUrl = msg.ReturnUrl; 

     env.RemovePartialLoginCookie(); 

     return Redirect(returnUrl); 
    } 

    // Otherwise show the login form as usual 
    return View(); 
} 

, user.Identity değeri o bilgilerle doldurulur değildir ve bu nedenle IsAuthenticated yanlıştır: İşte benim düşünce sürecine göstermemesini çalışan kod. Şu anda neden başarısız olduğunu anlatan bir sözüm var: IDS3 ile ilişkili bağlamın Kimlik Doğrulama değerini istiyorum, sonradan olduğum tanımlama bilgisi kimlik doğrulaması olan MVC uygulamam için olanı değil. (Bu denetleyici benim MVC uygulamasının bir parçası olduğu için kavramsal olarak kafa karıştırıcıdır.)

Bu muhtemelen bir IDS3 sorusu ve bir OWIN sorusu daha azdır, ama benim umudum, başka birinin bu hacky'yi uygulamaya çalıştığıdır. önce yaklaşım ve doğru yönde bana işaret edebilir. Umarım, http://www.asp.net/aspnet/samples/owin-katana numaralı telefondan bulduğum tüm OWIN örneklerini incelediğimde işler daha mantıklı olacak, ama şu an sıkışmış durumdayım.

Startup.cs başvuru için (öyle olduğu temelde CustomLoginPage örnek projesinden kopyalayıp yapıştırarak özel kullanıcı servis kodu yoktu): Bir kullanıcı zaten var olan çerez aracılığıyla kaydedilir

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var container = AutofacConfig.Configure(); 

     app.UseAutofacMiddleware(container); 
     app.UseAutofacMvc(); 

     ConfigureAuthentication(app); 
     ConfigureIdentityServer(app); 
    } 

    private static void ConfigureAuthentication(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, 
      LoginPath = new PathString("/login") 
     }); 
    } 

    private static void ConfigureIdentityServer(IAppBuilder app) 
    { 
     var factory = new IdentityServerServiceFactory() 
      .UseInMemoryClients(Clients.Get()) 
      .UseInMemoryScopes(StandardScopes.All); 

     factory.UserService = new Registration<IUserService>(resolver => 
      resolver.ResolveFromAutofacOwinLifetimeScope<IUserService>()); 

     var options = new IdentityServerOptions 
     { 
      SiteName = "test", 
      SigningCertificate = LoadCertificate(), 
      Factory = factory, 

      AuthenticationOptions = new AuthenticationOptions 
      { 
       EnableLocalLogin = true, 

      } 
     } 

     app.Map("/identity", idsrvApp => 
     { 
      idsrvApp.UseIdentityServer(options); 
     }); 
    } 
} 

cevap

0

eğer kimlik doğrulama ve onlar daha sonra y özel kullanıcı hizmetinde PreAuthenticate uygularsanız tekrar

kimlik bilgilerini girmeniz istenmez ki otomatik IDS3 için onları log, test istemcisi aracılığıyla bir kod-akışını başlatır Kullanıcının önceden kimliği doğrulanmış olduğunu bilmek için özel çerezinizi tespit edebilirsiniz. Daha sonra PreAuthenticate'dan geçerli bir AuthenticationResult yayımlayabilirsiniz. Böyle bir şey gösteren bir örneğimiz var.

Yukarıda gördüğünüz kodun geri kalanından emin değilim - Neden sahip olduğunuz ve neye uygun olduğu konusunda biraz kafam karışmış, bu yüzden neden olabileceğine veya yorumlanamayacağına dair yorum yapmakta tereddüt ediyorum çalışıyor.

+0

PreAuthenticate uygulamasının uygulanmaya çalışılması benim ilk denememdi, ancak özel tanımlama bilgisi bitini tespit edemedim. İlk denemem, kullanıcıyı bir IOwinEnvironment enjekte ederek, OwinContext'i oluşturarak tanımlamak ve daha sonra özel çerez auth'unda oturum açmış olsam bile her zaman false olan Authentication.User.Identity.IsAuthenticated durumunu kontrol etmekti. 2 numaralı girişimde, Kimlik Doğrulama çerezi isteğimden çıkarılmaya çalışılacaktı, şifresini çöz, ardından oradan kontrol et. Özel çerezi tespit ederek önerdiğiniz şey bu mu yoksa eksik olduğum başka bir seçenek var mı? – timbermeshivers

+0

Evet, özel bir çerezde olduğunu söylediniz - eğer owin içeriğiniz varsa o zaman kurabiyeye ulaşabilmeniz gerekir. User.IsAuthenticated öğesine erişme doğru şey olmayabilir - ancak tanımlama bilgisini kontrol etmek için Katana kodunu almak için AuthenticateAsync'i arayabilmeniz gerekir. –

+0

Başarı! Yardım için teşekkürler. İçindeki tanımlama ve kimlik kimliğini alabildim. Görünüşe göre, çerezin şifresini çözmeyi denemek için bazı eski teknikler kullanıyordum, ama bakmadığı birkaç gün, tekrar gözden geçirdiğimde, dışarı atladım. – timbermeshivers

0

Birinin benim gibi aynı hacky çözümüne ihtiyacı olduğunu görmek güzel. IdentityServer ile kullanıcı kimliğini doğrulamak için eski Üyelik çerezini kullanmak zorunda kaldım. Benim çözümüm oldukça basitti - bunun için kullanici.Identity.IsAuthenticated kullanmıyordum, ama cookie değerini doğrudan Raw değeri olarak okuyor ve kullanıcı adının şifresini çözmek için Üyelik sınıflarını kullandı. Bununla, kimlik doğrulama için farklı çerez sağlayıcılarıyla sorun yaşamadım. Bütün konsept hacky olduğu için, bu durumda el kitabını manüel okuyamam.