授权属性不在asp.net核心中工作

时间:2018-02-22 08:24:17

标签: asp.net asp.net-core identityserver4

我正在asp.net core 2.0中开发一个简单的Web应用程序来测试身份服务器4的实现。我创建了一个新项目(WebApplication(模型 - 视图 - 控制器)。我可以使用TokenClient.RequestRefreshTokenAsync方法成功生成accessToken和refreshToken但是当我尝试调用任何具有Authorize Attribute的操作时,它会将登录页面作为postman响应部分的html。我也在调用的Authorization标题中传递了accessToken。我是第一次这样做,所以我觉得我在启动文件中有一些问题。 这是代码:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddScoped<Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>();
        // configure identity server with in-memory stores, keys, clients and scopes
        services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddInMemoryPersistedGrants()
        .AddInMemoryIdentityResources(Config.GetIdentityResources())
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients())
        .AddAspNetIdentity<ApplicationUser>();


        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        // Add application services.
        services.AddTransient<IEmailSender, EmailSender>();


        services.AddMvc();
    }

以下是创建令牌的操作:

var disco = await DiscoveryClient.GetAsync("http://localhost:5000");
                if (disco.IsError)
                {
                    Console.WriteLine(disco.Error);
                    return BadRequest();
                }
                var tokenClient = new TokenClient(disco.TokenEndpoint, "ro.client", "secret");

                var tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync(model.Email, model.Password, "api1");

以下是授权属性的操作:

 [HttpGet]
    [Authorize]
    public ObjectResult Test()
    {
        return new ObjectResult(Ok());
    }

这是邮递员的电话: Postman Call

任何人都能说出我做错了什么。 感谢

1 个答案:

答案 0 :(得分:0)

我无法在此处看到任何设置,告诉我您已启用基于令牌的授权,这是您根据Postman呼叫尝试执行的操作。 看起来您的服务器仅使用cookie,但您希望通过承载令牌进行身份验证。

您需要在受保护的服务器上实施基于承载的身份验证,并将其指向您的ID4实现。

E.g。 api服务器设置可能如下所示:

services.AddAuthentication("Bearer")
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority = "http://localhost:5000"; //This is your ID4 server
                options.RequireHttpsMetadata = false;

                options.ApiName = "api1";
            });

请阅读此页面,其中将介绍要安装的nuget包以及如何使用令牌配置保护。 http://docs.identityserver.io/en/release/quickstarts/1_client_credentials.html