如何使用[Authorize(Roles)]属性授权动作?

时间:2019-05-13 22:48:36

标签: asp.net-identity postman asp.net-core-webapi

我正在尝试使用基于单个模型类的控制器创建一个简单的Web 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的更多知识,但是我不知道如何“登录并打开会话”(这是我认为可以解决该问题的方法),而且我找不到任何资源来解释怎么做,更不用说如何通过Postman或Swagger UI获得结果了。

1 个答案:

答案 0 :(得分:0)

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,您应该在标题下方看到一个Authorize按钮。单击它,并提供所需的必要身份验证信息,您应该会很好。

至于ASP身份,如果我没有记错的话,将ASP身份用于Web API并不是很常见。我个人会切换到Basic或OAITH,因为在谈论API时听起来更自然。