我通过添加以下几行来配置MVC客户端。
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer();
错误消息如预期的那样是401未经授权。因此,我为承载as suggested by Microsoft添加了配置。
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(_ =>
{
_.Authority = "http://localhost:5000";
_.Audience = "http://localhost:5002";
});
在我的解决方案中,端口5000托管IDS4提供程序,而端口5002托管MVC应用程序。那时我遇到了一个错误,因为我目前正在严格执行HTTP。建议是通过将 RequireHttpsMetadata 设置为 false 来降低安全性,如下所示。
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(_ =>
{
_.Authority = "http://localhost:5000";
_.Audience = "http://localhost:5002";
_.RequireHttpsMetadata = false;
})
令我感到失望的是,当我请求由 [Authorize] 装饰的活动页面时,我再次在浏览器中获得401 Unauthorized。
我不确定如何进一步诊断。我正在尝试将我的代码与大量示例进行比较,但是看不到任何明显的不同。而且,许多实例都考虑了其他版本的Core,IDS或方案。我需要建议气味的来源。
答案 0 :(得分:1)
在IdentityServer4 samples中,您可以看到他们正在使用AddOpenIdConnect
而不是AddJwtBearer
作为MVC Client示例。然后,您的MVC客户端服务注册应如下所示:
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ClientId = "mvc";
options.SaveTokens = true;
});
最后,请确保您有一个允许范围访问您的api资源和适当授权类型的客户端:
// OpenID Connect implicit flow client (MVC)
new Client
{
ClientId = "mvc",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.Implicit,
RedirectUris = { "http://localhost:5002/signin-oidc" },
PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile
}
}
AddOpenIdConnect
基本上为您预配置了IDS4回调的处理程序终结点,以使用户登录和注销以及创建适当的ClaimsPrincipal
。