добавить пользовательский интерфейс аутентификации в Swagger - PullRequest
1 голос
/ 30 мая 2019

У меня есть приложение C # ASP.NET Web API с аутентификацией на основе токена. Реализация аутентификации находится в файле startup.cs следующим образом

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Enable CORS (cross origin resource sharing) for making request using browser from different domains
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

        OAuthAuthorizationServerOptions options = new OAuthAuthorizationServerOptions
        {
            AllowInsecureHttp = true,
            //The Path For generating the Toekn
            TokenEndpointPath = new PathString("/api/token"),
            //Setting the Token Expired Time (24 hours)
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            //MyAuthorizationServerProvider class will validate the user credentials
            Provider = new MyAuthorizationServerProvider()
        };
        //Token Generations
        app.UseOAuthAuthorizationServer(options);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

        HttpConfiguration config = new HttpConfiguration();
        WebApiConfig.Register(config);
    }
}

Определение аутентификации выполняется в следующем классе

public class MyAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
    }
    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        using (UserMasterRepository _repo = new UserMasterRepository())
        {
            var user = _repo.ValidateUser(context.UserName, context.Password);
            if (user == null)
            {
                context.SetError("invalid_grant", "Provided username and password is incorrect");
                return;
            }
            var identity = new ClaimsIdentity(context.Options.AuthenticationType);
            identity.AddClaim(new Claim(ClaimTypes.Role, user.UserRoles));
            identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
            identity.AddClaim(new Claim("Email", user.UserEmailID));
            context.Validated(identity);
        }
    }
}

Я добавил Swagger в приложение, оно работает хорошо: оно показывает все методы, которые я реализовал в приложении webapi ЗА ИСКЛЮЧЕНИЕМ интерфейса аутентификации Iпротестировал приложение с PostMan, в котором я могу получить токен после заполнения имени пользователя и пароля. Я хочу сделать то же самое в SWAGGER: добавить интерфейс, из которого я могу получить токен после заполнения логина / пароля

Как я могу это сделать?

После публикации вопроса я нашел решение , которое я реализовал в Swaggerconfig.cs файле, но яПолучение этой ошибки "swaggerUiconfig не содержит определения для DocumentFilter. Я добавил

class AuthTokenOperation : IDocumentFilter
    {
        public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
        {
            swaggerDoc.paths.Add("/api/token", new PathItem
            {
                post = new Operation
                {
                    tags = new System.Collections.Generic.List<string> { "Auth" },
                    consumes = new List<string>
            {
                "application/x-www-form-urlencoded"
            },
                    parameters = new List<Parameter> {
                new Parameter
                {
                    type = "string",
                    name = "grant_type",
                    required = true,
                    @in = "formData"
                },
                new Parameter
                {
                    type = "string",
                    name = "username",
                    required = false,
                    @in = "formData"
                },
                new Parameter
                {
                    type = "string",
                    name = "password",
                    required = false,
                    @in = "formData"
                }
            }
                }
            });
        }
    }

, но вызов c.DocumentFilter (); не принято, кажется, что там яКонфликт версий с DocumentFilter Как я могу это исправить?

...