2017-02-14 15 views
6

Çerezleri paylaşabilmem için aşağıda belirtilen ana ana etki alanını paylaşan 2 web uygulamasına sahibim. Her iki projede de Web.conifg aynı makine anahtarı ve doğrulama anahtarına sahiptir. Kimlik ve NOT formları kimlik doğrulaması kullanmak istediğim için web.config dosyamdan birinde bir düğüm yok. SSO'dan Auth çerezini başarılı bir şekilde oluşturabiliyorum ve SSO'daki yetkili sayfaları görüntüleyebiliyorum ancak MVC projesinde yetkili bir görünüme erişmeye çalıştığımda SSO oturumuna yeniden yönlendiriliyorum.Tek Oturum Açma 2 ASP.NET MVC projeleri arasında ASP.NET Kimliği'ni kullanma

  1. sso.domain.com - MVC Proje
  2. mvc.domain.com - MVC Proje

aşağıda gibi benim TOA ve MVC projesinde bir startup.cs dosyası var:

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     ConfigureAuth(app); 
    } 

    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

     // Enable the application to use a cookie to store information for the signed in user 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      ExpireTimeSpan = TimeSpan.FromMinutes(3),     
      LoginPath = new PathString("/Login"), 
      CookieName = "MyCookieName", 
      CookieDomain = ".domain.com"    
     }); 

     app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); 

     AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier; 
    } 
} 

Aşağıda, SSCo projesinde AccountController.cs altında bulunan kod yer almaktadır. Ben çerez oluşturur veritabanına karşı kullanıcıyı doğrulamak aşağıda IdentitySignin işlevini çağırır:

 private void IdentitySignin(string userId, string name, string providerKey = null, bool isPersistent = false) 
    { 
     var claims = new List<Claim>(); 

     // create *required* claims 
     claims.Add(new Claim(ClaimTypes.NameIdentifier, userId)); 
     claims.Add(new Claim(ClaimTypes.Name, name));    

     var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie); 


     //get the expiry minutes from config or use the default value of 30 minutes 
     double expiryMinutes; 
     expiryMinutes = double.TryParse(ConfigurationManager.AppSettings["AuthCookieExpiryMinutes"], out expiryMinutes) ? expiryMinutes : 30; 

     // add to user here! 
     AuthenticationManager.SignIn(new AuthenticationProperties() 
     { 
      AllowRefresh = true, 
      IsPersistent = isPersistent, 
      ExpiresUtc = DateTime.UtcNow.AddMinutes(expiryMinutes), 
      IssuedUtc = DateTime.UtcNow     
     }, identity); 
    } 

    private void IdentitySignout() 
    { 
     AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie); 
    } 

    private IAuthenticationManager AuthenticationManager 
    { 
     get 
     { 
      return HttpContext.GetOwinContext().Authentication; 
     } 
    } 

    private async Task<string> GetVerifiedUserIdAsync() 
    { 
     var result = await AuthenticationManager.AuthenticateAsync(
      DefaultAuthenticationTypes.ApplicationCookie); 

     if (result != null && result.Identity != null 
      && !String.IsNullOrEmpty(result.Identity.GetUserId())) 
     { 
      return result.Identity.GetUserId(); 
     } 
     return null; 
    } 

cevap

4

Büyük olasılıkla, paylaşılan bir makine anahtarı belirlemediniz. Kimlik bilgisi çerezi şifrelenir ve her iki site de aynı makine anahtarını paylaşmadığı sürece, diğerinin şifrelenmiş şifresini çözemez. Her iki projenin Web.config için aşağıdaki ekleyin:

<sytem.web> 

    ... 

    <machineKey validation="HMACSHA256" validationKey="[validationKey]" decryptionKey="[decryptionKey]" compatibilityMode="Framework45" /> 

, IIS anahtarları oluşturmak sol bölmedeki sunucuda tıklatın ve sonra Makinası Anahtar kontrol paneli öğesi için. Doğrulama yönteminizi seçin (yukarıda, HMACSHA256'yı kullandım). Çatlamak için gülünç derecede kolay olduğu için SHA1'in varsayılan değerini kullanmanızı önermem. Daha sonra, sağdaki "Eylemler" panelinde, "Anahtar Oluştur" u tıklayın. İki metin kutusu değerini bu yapılandırma öğesinin uygun niteliklerine kopyalayın ve kimlik doğrulama çerezini paylaşması gereken tüm projeler için aynı olduklarından emin olun.

+0

Bu Chris hakkındaki hızlı yanıt için teşekkürler, ancak yukarıdaki soruda belirtmiş olduğum gibi, her iki projenin web.config dosyasında da aynı makine anahtarı yapılandırmasına sahibim. – user2272865

4

Yani, Tek Oturum Açma'nın, her ikisi de aynı makine ve doğrulama anahtarlarını paylaşmasına rağmen 2 MVC uygulaması arasında çalışmadığının nedenini anladım.

Benim SSO MVC uygulamasının ve diğer MVC uygulamasının her ikisi de farklı bir OWIN ve ASP.NET Identity DLL sürümü kullanıyordu. Bir projede DLL'leri güncellemek için Nuget'i kullandım, ancak diğeride güncelleme yapmadım.

Umarım bu sorunla karşılaşan birine yardımcı olur.

Sadece bir Bilginize olarak, emin HER şeylerin altına sahip olmalarını, 1'den fazla uygulaması arasında ASP.NET Kimlik Doğrulaması paylaşmak için APP:

  1. Aynı Makine Tuşlar ve web Doğrulama anahtarları. yapılandırma dosyası Hem uygulama yetkilendirme çerez paylaşmak için aynı etki alanında olması gerekir Startup.cs
  2. yılında
  3. aynı çerez adı vE çerez alan Owin ve ASP.NET KİMLİK dll
  4. aynı versiyonları