无法在.NET Core 2.2和Identity Server 4上进行身份验证

时间:2019-01-07 19:56:05

标签: c# identityserver4 asp.net-core-2.2

这个问题将在两天内悬而未决,但在此之前我需要帮助。

我正在同一解决方案中运行两个项目。一个是我的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并没有真正运行,我怀疑花时间对它进行故障排除是没有意义的。

0 个答案:

没有答案