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
cevap
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.
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
Kesinlikle, bu şekilde kimlik doğrulaması yapıyorsunuz. Sadece "grant_type: client_credentials", "client_id:
Daha spesifik olmalıydım ... Açılan formla kastettim. – Zoop
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
- 1. Spring Boot + Oauth2 istemci kimlik bilgileri
- 2. İlkbahar OAuth2 Kimlik Doğrulama Sunucusuna daha sonra bir istemci ekleme
- 3. Kimlik Bilgilerini WebProxy'ye Aktarma?
- 4. WCF Windows kimlik doğrulaması, kimlik bilgilerini açıkça ayarlamadan nasıl çalışır
- 5. Bir WCF uygulaması için kimlik bilgilerini ayarlama?
- 6. , Windows 8.1'de Windows Kimlik Doğrulama'yı etkinleştir
- 7. Facebook'un TOKEN'ini almak için istemci kimlik bilgileri
- 8. javascript ile istemci bilgilerini nasıl görüntüleyebilirim?
- 9. Oauth2
- 10. İstemci kimlik bilgileriyle SSL üzerinden HttpWebRequest
- 11. Oauth2/Parola akış/belirli bir varlık için kontrol iznine
- 12. ASP.NET Windows Kimlik Doğrulama Çalışmıyor/Kimlik Bilgilerini Kabul Etmiyor
- 13. AFNetworking ile temel kimlik doğrulama bilgilerini sıfırlama
- 14. Öğe kimliği ile kimlik bilgilerini Rows.count
- 15. Komut satırında alan kimlik bilgilerini doğrulama
- 16. Kimlik bilgilerini WCF Hizmetine aktarma 401
- 17. Kubernetes AWS dağıtımı docker kimlik bilgilerini ayarlayamıyor
- 18. Grails'te Maven kimlik bilgilerini dışa aktarma 2.4
- 19. Kayıtlı kimlik bilgilerini TortoiseGit üzerinden silme
- 20. Forma ile istemci kimlik doğrulaması
- 21. SearchBar'i Etkinleştir
- 22. WCF'de, bir webHttpBinding için, sunucu temel kimlik doğrulaması kullanırken istemci tarafı web.config dosyasında kimlik bilgilerini nasıl belirleyebilirim?
- 23. Mobil Cihazlar İçin OAuth2 Akışı
- 24. OAuth2
- 25. WCF istemci yapılandırma dosyasında Windows kimlik bilgileri nasıl belirtilir
- 26. Spring Boot OAuth2 - Kullanıcı ayrıntıları alınamadı token
- 27. Oauth2 Hibe Türleri ve İyi belge için gerçek zamanlı örnekler, Bahar MVC ile Oauth2 örneği
- 28. java.net.HttpRetryException: Sunucu kimlik doğrulaması nedeniyle yeniden deneme yapamazsınız, akış modunda
- 29. Retrofit özel WebTokens kimlik doğrulaması için istemci
- 30. İstemci kimlik doğrulaması olmadan dropbox api'ye erişme?
Bunun için bir çözüm buldunuz mu? –
Hayır demek için üzgünüm. Bunu bizim için çözen üretimde havalı kullanmaya karar verdik. – mstrand