Web API 2,Swagger& IdentityServer3

时间:2017-05-12 12:29:10

标签: asp.net-web-api2 swagger swagger-ui identityserver3

我正在尝试使用Swagger和IdentityServer设置Web API,但无法弄清楚如何使Swagger正常工作。

我的React应用程序正在使用IdentityServer,我设法让ui正常工作但是当我尝试激活身份验证时,我总是遇到“insufficient_scope”错误。

这是我的配置:

客户端

 //I save current tab id here and then execute script below

 chrome.tabs.create({ url: x.url }, tab => {
     window.setInterval(() => {
         this.productService.getUserInfo().subscribe(() => {
             this.router.navigate(['parsing']);
             chrome.tabs.remove(tab.id, () => {
                 //Open the previous tab
             });
             }, error => {});
     }, 1000 * 10);
 });         

范围

public static IEnumerable<Client> Get()
{
    return new[]
    {
        new Client
        {
            ClientId = "ipassportimplicit",
            ClientName = "iPassport (Implicit)",
            Flow = Flows.Implicit,
            AllowAccessToAllScopes = true,
            //redirect = URI of the React application callback page
            RedirectUris = new List<string>
            {
                Constants.iPassportReact + "callback.html"
            }
        },
        new Client
        {
            ClientId = "swaggerui",
            ClientName = "Swagger (Implicit)",
            Flow = Flows.Implicit,
            AllowAccessTokensViaBrowser = true,
            PostLogoutRedirectUris = new List<string>
            {
                "http://localhost:53633/swagger/"
            },
            AllowAccessToAllScopes = true,
            RedirectUris = new List<string>
            {
                "http://localhost:53633/swagger/ui/o2c-html"
            }
        }
    };
}

SwaggerConfig

public static IEnumerable<Scope> Get()
{
    return new List<Scope>
        {                    
            new Scope
            { 
                Name = "passportmanagement",
                DisplayName = "Passport Management",
                Description = "Allow the application to manage passports on your behalf.",
                Type = ScopeType.Resource 
            },
            new Scope
            {
                Name = "swagger",
                DisplayName = "Swagger UI",
                Description = "Display Swagger UI",
                Type = ScopeType.Resource
            }
        };
}

操作过滤器

public static void Register(HttpConfiguration config)
{
    var thisAssembly = typeof(SwaggerConfig).Assembly;

    config
        .EnableSwagger(c =>
            {
                c.SingleApiVersion("v2", "api_iPassport");

                c.OAuth2("oauth2")
                    .Description("OAuth2 Implicit Grant")
                    .Flow("implicit")
                    .AuthorizationUrl(Constants.iPassportSTSAuthorizationEndpoint)
                    .TokenUrl(Constants.iPassportSTSTokenEndpoint)                            
                    .Scopes(scopes =>
                    {
                        scopes.Add("swagger", "Swagger UI");
                    });

                c.OperationFilter<AssignOAuth2SecurityRequirements>();
            })
        .EnableSwaggerUi(c => 
            {   
                c.EnableOAuth2Support("swaggerui", "swaggerrealm", "Swagger UI");
            });
}

响应标头

public class AssignOAuth2SecurityRequirements : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        var actFilters = apiDescription.ActionDescriptor.GetFilterPipeline();
        var allowsAnonymous = actFilters.Select(f => f.Instance).OfType<OverrideAuthorizationAttribute>().Any();
        if (allowsAnonymous)
            return; // must be an anonymous method


        //var scopes = apiDescription.ActionDescriptor.GetFilterPipeline()
        //    .Select(filterInfo => filterInfo.Instance)
        //    .OfType<AllowAnonymousAttribute>()
        //    .SelectMany(attr => attr.Roles.Split(','))
        //    .Distinct();

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

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

        operation.security.Add(oAuthRequirements);
    }
}

我看不到的任何东西?所有帮助表示赞赏!

由于

1 个答案:

答案 0 :(得分:0)

我的问题出现在Web API的Startup.cs类中,我没有将所需的范围添加到

public void ConfigureAuth(IAppBuilder app)
{
    var options = new IdentityServerBearerTokenAuthenticationOptions()
    {
        Authority = Constants.iPassportSTS,
        RequiredScopes = new[] { "passportmanagement", "swagger" }
    };

    app.UseIdentityServerBearerTokenAuthentication(options);
}