2015-11-17 22 views
9

Bir Web API'sini istemci kimlik bilgileriyle güvenli hale getirmek için IdentityServer3 kullanıyorum. Belgelerim için Swashbuckle kullanıyorum, ancak istemci kimlik bilgileri (uygulama) akışı için SwaggerConfig'te Oauth2'nin nasıl etkinleştirileceğini anlayamıyorum. Herhangi bir yardım takdir edilecektir!Oauth2 istemci kimlik bilgilerini akış Swashbuckle'da etkinleştir

+0

Bunun için bir çözüm buldunuz mu? –

+0

Hayır demek için üzgünüm. Bunu bizim için çözen üretimde havalı kullanmaya karar verdik. – mstrand

cevap

7

Bu çalışmayı başardım. Yanıtın çoğu here bulunabilir.

Istemci lisansı almaya çalışmak için değiştirmem gereken birkaç bölüm vardı. ilk bölümü EnableSwagger olduğunu ve EnableSwaggerUi çağırır:

config.EnableSwagger(c => 
    { 
    c.SingleApiVersion("v1", "sample api"); 
    c.OAuth2("oauth2") 
    .Description("client credentials grant flow") 
    .Flow("application") 
    .Scopes(scopes => scopes.Add("sampleapi", "try out the sample api")) 
    .TokenUrl("http://authuri/token"); 
    c.OperationFilter<AssignOAuth2SecurityRequirements>(); 
    }).EnableSwaggerUi(c => 
    { 
    c.EnableOAuth2Support("sampleapi", "samplerealm", "Swagger UI"); 
    }); 

Burada önemli değişiklik .Flow("application") Ben de bu kurulduğundan belirli yetkilendirme şeması üzerinde sadece bağlıdır yerine .AuthorizationUrl ait .TokenUrl çağrısı kullanılır.

Ben de Bu kimlik doğrulama anahtarı göstermeye almak için yeterli olmalıdır biraz farklı AssignOAuth2SecurityRequirements sınıf

public class AssignOAuth2SecurityRequirements : IOperationFilter 
{ 
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) 
    { 
     var authorized = apiDescription.ActionDescriptor.GetCustomAttributes<AuthorizeAttribute>(); 
     if (!authorized.Any()) return; 

     if (operation.security == null) 
      operation.security = new List<IDictionary<string, IEnumerable<string>>>(); 

     var oAuthRequirements = new Dictionary<string, IEnumerable<string>> 
     { 
      {"oauth2", Enumerable.Empty<string>()} 
     }; 

     operation.security.Add(oAuthRequirements); 
    } 
} 

kullandı. Benim için diğer bir problem, varsayılan kimlik doğrulama iletişim kutusunun ayarlanmış olmasıdır, böylece bir kullanıcı sadece bir kapsam seçmek ve ardından yetkilendirmek için tıklamanız gerekir. Benim durumumda bu, kimlik doğrulama kurulumumdan dolayı işe yaramadı. Swagger-oauth.js betiğindeki iletişim kutusunu yeniden yazmam ve SwaggerUI'ye enjekte etmem gerekti.

+0

Tüketici dokümanı tüketicisine client_id veya client_id ve secret_key sağlamak için izin vermek için herhangi bir yolu var mı? – Zoop

+0

Kesinlikle, bu şekilde kimlik doğrulaması yapıyorsunuz. Sadece "grant_type: client_credentials", "client_id: " ve "secret_key: " ile bir giriş formu POST isteği oluşturun ve simge URL'sine gönderin. Daha sonra, oturum açmak için OAuthAuthorizationServerProvider alt sınıfını kullanabilirsiniz. –

+0

Daha spesifik olmalıydım ... Açılan formla kastettim. – Zoop

2

Tüm bunları çalışırken biraz daha fazla sıkıntı çektim, ancak çok fazla sebattan sonra SwaggerUI'ye herhangi bir JavaScript'i enjekte etmeden çalışan bir çözüm buldum. NOT: Benim zorluklarımın bir kısmı, bir yapılandırma sorunu hakkında henüz bilmeyen harika bir ürün olan IdentityServer3'ü kullanmaktan kaynaklanmış olabilir.

Değişikliklerimin çoğu, yukarıdaki faturalara benzer, ancak İşletim Filtremim farklı. Benim denetleyicisi olarak tüm yöntemler şöyle hayır Rollerle bir Yetki etiketine sahip: SwaggerConfig şöyle

public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) 
    { 
     // Correspond each "Authorize" role to an oauth2 scope, since I don't have any "Roles" defined, this didn't work 
     // and is in most of the Apply methods I found online. If you are like me and your [Authorize] tag doesn't contain 
     // any roles this will not work. 
     //var scopes = apiDescription.ActionDescriptor.GetFilterPipeline() 
     // .Select(filterInfo => filterInfo.Instance) 
     // .OfType<AuthorizeAttribute>() 
     // .SelectMany(attr => attr.Roles.Split(',')) 
     // .Distinct(); 

     var scopes = new List<string>() { "Read" }; // For me I just had one scope that is added to all all my methods, you might have to be more selective on how scopes are added. 

     if (scopes.Any()) 
     { 
      if (operation.security == null) 
       operation.security = new List<IDictionary<string, IEnumerable<string>>>(); 

      var oAuthRequirements = new Dictionary<string, IEnumerable<string>> 
      { 
       { "oauth2", scopes } 
      }; 

      operation.security.Add(oAuthRequirements); 
     } 
    } 

: OperationFilter etiketlemek yetkilendirme üzerinde tanımlı hiçbir Roller ile

[Authorize] 
// Not this 
[Authorize(Roles = "Read")] // This doesn't work for me. 

şuna benzer:

public static void Register() 
{ 
    var thisAssembly = typeof(SwaggerConfig).Assembly; 
    GlobalConfiguration.Configuration 
     .EnableSwagger(c => 
     { 
      c.SingleApiVersion("v1", "waPortal"); 
      c.OAuth2("oauth2") 
       .Description("OAuth2 Client Credentials Grant Flow") 
       .Flow("application") 
       .TokenUrl("http://security.RogueOne.com/core/connect/token") 
       .Scopes(scopes => 
       { 
        scopes.Add("Read", "Read access to protected resources"); 
       }); 
      c.IncludeXmlComments(GetXmlCommentsPath()); 
      c.UseFullTypeNameInSchemaIds(); 
      c.DescribeAllEnumsAsStrings(); 
      c.OperationFilter<AssignOAuth2SecurityRequirements>(); 
     }) 
     .EnableSwaggerUi(c => 
     { 
      c.EnableOAuth2Support(
       clientId: "swaggerUI", 
       clientSecret: "BigSecretWooH00", 
       realm: "swagger-realm", 
       appName: "Swagger UI" 
      ); 
     }); 
} 

son bölüm sonunda ağ etiketi ler üzerinde küçük kırmızı X gösterdi Chrome Geliştirici araçları yardımıyla yaptığımız anlamaya zor oldu ": http://localhost:62561 Erişim-Control-Allow-Origin" O başlığını göndermek için IdentityServer3 zorlayabilir Ben doğru bir yanıt başlığını ekleyerek burada nedeniyle IdentityServer3 oldu Swagger UI not parsing reponse bu hatayı açıklanan

XMLHttpRequest cannot load http://security.RogueOne.com/core/connect/token. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:62561' is therefore not allowed access. 

: Aşağıdaki hata iletisini howing size müşteri yaratma güncelleyerek aşağıdaki olmaya:

new Client 
{ 
    ClientName = "SwaggerUI", 
    Enabled = true, 
    ClientId = "swaggerUI", 
    ClientSecrets = new List<Secret> 
    { 
     new Secret("PasswordGoesHere".Sha256()) 
    }, 
    Flow = Flows.ClientCredentials, 
    AllowClientCredentialsOnly = true, 
    AllowedScopes = new List<string> 
    { 
     "Read" 
    }, 

    Claims = new List<Claim> 
    { 
     new Claim("client_type", "headless"), 
     new Claim("client_owner", "Portal"), 
     new Claim("app_detail", "allow") 
    }, 
    PrefixClientClaims = false 
    // Add the AllowedCorOrigins to get the Access-Control-Allow-Origin header to be inserted for the following domains 
    ,AllowedCorsOrigins = new List<string> 
    { 
     "http://localhost:62561/" 
     ,"http://portaldev.RogueOne.com" 
     ,"https://portaldev.RogueOne.com" 
    } 
}  

AllowedCorsOrigins benim bulmacanın son parçası idi. Umarım bu aynı sorunla karşılaşan birine yardımcı olur

İlgili konular