2016-10-04 15 views
1

У нас есть требование включить SOML SSO для входа в мое приложение. Мое приложение представляет собой решение Angular JS + Asp.Net Web API. Мое приложение уже использует аутентификацию Owin Bearer в качестве модели авторизации.Нет Idp с идентификатором объекта «http://stubidp.kentor.se/Metadata» обнаружена ошибка в Kentor Auth Services

Чтобы включить Saml SSO Im, экспериментируя с Kentor Auth Services. Но я столкнулся с проблемой, когда Idp называет мой webapi. Служба kentor выбрасывает Данный ключ отсутствует в словаре. ошибка. Im использует http://stubidp.kentor.se/ для проверки реализации. Ниже моя конфигурация SAML от запуска класса

public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.UseCors(CorsOptions.AllowAll); 
      ConfigureOAuth(app); 

      var config = new HttpConfiguration(); 
      WebApiConfig.Register(config); 
      app.UseWebApi(config); 

      AreaRegistration.RegisterAllAreas(); 
      GlobalConfiguration.Configure(WebApiConfig.Register); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      GlobalConfiguration.Configuration.MessageHandlers.Add(new CachingHandler(GlobalConfiguration.Configuration)); 
     } 
     public void ConfigureOAuth(IAppBuilder app) 
     { 
      app.CreatePerOwinContext(ApplicationDbContext.Create); 
      app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 
      app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
      var oAuthServerOptions = new OAuthAuthorizationServerOptions 
      { 
       AllowInsecureHttp = true, 
       TokenEndpointPath = new PathString("/Auth/token"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
       Provider = new JobPulseAuthorizationServerProvider() 
      }; 
      app.UseCookieAuthentication(new CookieAuthenticationOptions 
      { 
       AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
       LoginPath = new PathString("/Account/Login"), 
       Provider = new CookieAuthenticationProvider 
       { 
        // Enables the application to validate the security stamp when the user logs in. 
        // This is a security feature which is used when you change a password or add an external login to your account. 
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
          validateInterval: TimeSpan.FromMinutes(30), 
          regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager, DefaultAuthenticationTypes.ExternalCookie)) 
       } 
      }); 
      app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

      // Token Generation 
      //app.UseOAuthAuthorizationServer(oAuthServerOptions); 
      //app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 
      app.UseKentorAuthServicesAuthentication(CreateAuthServicesOptions()); 
     } 

     private static KentorAuthServicesAuthenticationOptions CreateAuthServicesOptions() 
     { 
      var spOptions = GetServiceProviderOptions(); 
      var authServicesOptions = new KentorAuthServicesAuthenticationOptions(false) 
      { 
       SPOptions = spOptions 
      }; 

      var idp = new IdentityProvider(new EntityId("~/App_Data/KentorIDPMetadata.xml"), spOptions) 
      { 
       AllowUnsolicitedAuthnResponse = true, 
       Binding = Saml2BindingType.HttpRedirect, 
       SingleSignOnServiceUrl = new Uri("http://stubidp.kentor.se/") 
      }; 

      idp.SigningKeys.AddConfiguredKey(
        new X509Certificate2(fileName: HostingEnvironment.MapPath(
            "~/App_Data/Kentor.AuthServices.StubIdp.cer"))); 

      authServicesOptions.IdentityProviders.Add(idp); 

      return authServicesOptions; 
     } 

     private static SPOptions GetServiceProviderOptions() 
     { 
      var cultureInfo = CultureInfo.GetCultureInfo("en-US"); 
      var organization = new Organization 
      { 
       Names = { new LocalizedName("Kentor", cultureInfo) }, 
       DisplayNames = { new LocalizedName("Kentor IT AB", cultureInfo) }, 
       Urls = { new LocalizedUri(new Uri("http://www.kentor.se"), cultureInfo) } 
      }; 
      var spOptions = new SPOptions 
      { 
       EntityId = new EntityId("http://localhost:53390/AuthServices/acs"), 
       ReturnUrl = new Uri("http://localhost:53390/Account/ExternalLoginCallback"), 
       Organization = organization 
      }; 
      spOptions.Contacts.Add(new ContactPerson 
      { 
       Type = ContactType.Technical, 
       EmailAddresses = { "[email protected]" } 
      }); 

      spOptions.Contacts.Add(new ContactPerson 
      { 
       Type = ContactType.Support, 
       EmailAddresses = { "[email protected]" } 
      }); 
      var attributeConsumingService = new AttributeConsumingService("AuthServices") 
      { 
       IsDefault = true, 
       RequestedAttributes = 
       { 
        new RequestedAttribute("urn:someName") 
        { 
         FriendlyName = "Some Name", 
         IsRequired = true, 
         NameFormat = RequestedAttribute.AttributeNameFormatUri 
        }, 
        new RequestedAttribute("Minimal") 
       } 
      }; 
      spOptions.AttributeConsumingServices.Add(attributeConsumingService); 

      spOptions.ServiceCertificates.Add(new X509Certificate2(
        AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "/App_Data/Kentor.AuthServices.Tests.pfx")); 

      return spOptions; 
     } 

    } 

трассировки стека ошибки

[KeyNotFoundException: The given key was not present in the dictionary.] 
    System.Collections.Generic.Dictionary`2.get_Item(TKey key) +11759657 
    Kentor.AuthServices.Configuration.IdentityProviderDictionary.get_Item(EntityId entityId) +155 

[KeyNotFoundException: No Idp with entity id "http://stubidp.kentor.se/Metadata" found.] 
    Kentor.AuthServices.Configuration.IdentityProviderDictionary.get_Item(EntityId entityId) +291 
    Kentor.AuthServices.Saml2P.Saml2Response.CheckIfUnsolicitedIsAllowed(IOptions options) +108 
    Kentor.AuthServices.Saml2P.Saml2Response.Validate(IOptions options) +37 
    Kentor.AuthServices.Saml2P.<CreateClaims>d__53.MoveNext() +170 
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +381 

Можете ли вы дайте мне знать, почему Kentor не было в состоянии извлечь метаданные?

+0

Это всегда хорошая идея, чтобы перейти к конечной точке метаданных. Например, просмотр https://login.microsoftonline.com/common/.well-known/openid-configuration показывает, что адрес имеет правильный адрес. –

ответ

3

Вы путаете идентификатор объекта с указанием пути к метаданным. Метаданные отображаются по адресу, который является идентификатором объекта, но если вы помещаете метаданные локально, вам необходимо их разделить.

var idp = new IdentityProvider(new EntityId("http://stubidp.kentor.se/Metadata"), spOptions) 
{ 
    MetadataLocation = ""~/App_Data/KentorIDPMetadata.xml" 
    AllowUnsolicitedAuthnResponse = true, 
    // No need to add these if metadata is read. 
    // Binding = Saml2BindingType.HttpRedirect, 
    // SingleSignOnServiceUrl = new Uri("http://stubidp.kentor.se/") 
}; 

Еще более простой способ, чтобы загрузить метаданные непосредственно из IDP:

var idp = new IdentityProvider(new EntityId("http://stubidp.kentor.se/Metadata"), spOptions) 
{ 
    LoadMetadata = true, 
    AllowUnsolicitedAuthnResponse = true, 
}; 
+0

См. Обновленный вопрос. Вопрос «Нет Idp» теперь пропадает (спасибо вам). Im сталкивается с еще одной проблемой. Я продолжу проверять его. Между тем, если вы видите, можно увидеть какую-либо очевидную ошибку, пожалуйста, дайте мне знать – Umamaheswaran

+0

Я принял ответ, пожалуйста, найдите мой другой вопрос здесь http://stackoverflow.com/questions/39867318/what-are-audiencerestrisionconditions-in-kentorauthservices – Umamaheswaran