我正在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
任何人都能说出我做错了什么。 感谢
答案 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