这个问题将在两天内悬而未决,但在此之前我需要帮助。
我正在同一解决方案中运行两个项目。一个是我的ID提供程序(我正在使用IDS4),另一个是我的简单MVC客户端(控制器上有两种方法- Home / Open 和 Home / Secured 后者由属性 Authorize 装饰。
当我尝试访问打开的文件时,它的行为应与预期相同。但是,受保护的人向我扔了401, ,但没有被发送回登录页面。我相当确定我错过了客户端或服务器设置中必不可少的内容。
在 ID提供者一方,我有以下内容。
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<IdentityUser, IdentityRole>()
.AddDefaultTokenProviders();
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryPersistedGrants()
.AddInMemoryApiResources(ApiResources)
.AddInMemoryClients(Clients)
.AddTestUsers(Users)
.AddInMemoryIdentityResources(IdentityResources);
services.AddAuthentication()
.AddJwtBearer(_ =>
{
_.Authority = "https://localhost:5000";
_.Audience = "http://localhost:5001";
});
}
public IEnumerable<Client> Clients => new[]
{
new Client
{
ClientId = "MvcClient",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
AllowOfflineAccess = true,
RequireConsent = false,
ClientSecrets = { new Secret("MvcSecret".Sha256(), DateTime.Now.AddMinutes(2)) },
RedirectUris = { "http://localhost:5000/signin-oidc" },
PostLogoutRedirectUris = { "http://localhost:5002/" },
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email,
}
}
};
我已经确认手动输入 http://localhost:5000/signin-oidc/ ,可以看到位于其中的 index.html 文档。我期望当我尝试访问受保护的页面时,我会被打中。相反,我只得到一个简单的401。
在 MVC客户端上,我有以下内容。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(_ =>
{
_.Authority = "http://localhost:5000";
_.Audience = "http://localhost:5002";
_.SaveToken = true;
_.RequireHttpsMetadata = false;
_.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true };
})
.AddOpenIdConnect(_ => { _.ClientId = "mvc_client"; });
}
我需要弄清楚为什么它没有将我发送到指定的登录页面。我还需要想出一种在MVC下使用JWT进行登录和身份验证的方法。如果我至少对如何解决它和/或比较正确的行为提出建议,我将非常感激。一个可行的例子也很好。
我已经研究了好几天,我的看法是官方指南不清楚,开始变得过时,并且,这是最令人困惑的部分,在主题之间跳了一些而没有红线。我已经看到(并且已经看到很多)的所有示例和博客都无法在我的计算机上运行,或者对于最新版本的.NET Core(目前为2.2)无效。 closest one并没有真正运行,我怀疑花时间对它进行故障排除是没有意义的。