Как авторизовать действия с атрибутом [Authorize (Roles)]? - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь создать простой веб-API с контроллером на основе одного класса модели.

Я добавил AddIdentity в Startup.cs, создал две роли пользователя и попытался авторизовать действие в контроллере, чтобы он мог быть специально доступен для одной из двух ролей.Тем не менее, независимо от того, что я пытаюсь использовать для его проверки, это всегда приводит к ошибке, когда в ответе говорится, что сервер даже не выполняет указанное действие.До сих пор я пытался использовать Postman и Swagger UI, ни один из которых не дал мне правильного ответа.

Действие, к которому я пытаюсь получить доступ, будет таким:

        // GET api/media
        [HttpGet]
        [Authorize(Roles = "Member")]
        public IEnumerable<Media> Get()
        {
            return _mediaData.Get();
        }

Вот какЯ добавил поддержку идентификации в класс Startup.cs:

services.AddIdentity<User, Role>(config => { config.SignIn.RequireConfirmedEmail = false; })
                .AddEntityFrameworkStores<ApplicationDbContext>()
                //.AddDefaultUI()
                .AddDefaultTokenProviders();

То, что я ожидал, было объектом JSON, но в результате Swagger выдает мне сообщение об ошибке, в котором говорится, что я ожидал входа в систему, ноЯ не уверен, как я могу это сделать.Полагаю, мне нужно больше узнать о SignIn и UserManager, но я понятия не имею, как мне «войти в систему и открыть сессию» (это то, что, я полагаю, решит проблему), и я не смог найти какой-либо ресурс, объясняющийкак это сделать, тем более как получить результат через Почтальон или Swagger UI.

1 Ответ

0 голосов
/ 16 мая 2019

Swagger UI предоставляет вам способ аутентификации, для которого вам нужно внести несколько изменений в Startup.cs. Для этого измените ваш метод ConfigureServices на что-то вроде:

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
    c.AddSecurityDefinition("basic", new BasicAuthScheme() { Type = "basic" }); // Depending on your authentication, this will look different, but the most common one would be the Basic Authentication, so perhaps play with that or go with what you already had in mind
    c.DocumentFilter<BasicAuthDocumentFilter>();
});

Если вы используете обычную аутентификацию, вы можете использовать приведенный ниже код, чтобы снабдить Swagger фильтром документов (BasicAuthDocumentFilter), который может выглядеть следующим образом:

public class BasicAuthDocumentFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {
        var securityRequirements = new Dictionary<string, IEnumerable<string>>()
        {
            { "basic", new string[] { } }
        };
        swaggerDoc.Security = new[] { securityRequirements };
    }
}

Чтобы использовать его, просто откройте Swagger UI, и вы должны увидеть кнопку Авторизации под заголовком. Нажмите на него и предоставьте необходимую информацию для аутентификации, которая вам необходима, и вам будет хорошо.

Что касается ASP Identity, то если я не ошибаюсь, использование ASP Identity для веб-API не очень распространено. Я бы лично переключился на Basic или OAITH, так как они звучат более естественно, когда речь идет об API.

...