相关疑难解决方法(0)

如何在ASP.NET Core 2.0中设置多个身份验证方案?

我正在尝试将我的auth资源迁移到Core 2.0并使用我自己的身份验证方案出现问题.我在启动时的服务设置如下所示:

var authenticationBuilder = services.AddAuthentication(options =>
{
    options.AddScheme("myauth", builder =>
    {
        builder.HandlerType = typeof(CookieAuthenticationHandler);
    });
})
    .AddCookie();
Run Code Online (Sandbox Code Playgroud)

我在控制器中的登录代码如下所示:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Name)
};

var props = new AuthenticationProperties
{
    IsPersistent = persistCookie,
    ExpiresUtc = DateTime.UtcNow.AddYears(1)
};

var id = new ClaimsIdentity(claims);
await HttpContext.SignInAsync("myauth", new ClaimsPrincipal(id), props);
Run Code Online (Sandbox Code Playgroud)

但是当我在控制器或动作过滤器中时,我只有一个身份,而且它不是经过身份验证的身份:

var identity = context.HttpContext.User.Identities.SingleOrDefault(x => x.AuthenticationType == "myauth");
Run Code Online (Sandbox Code Playgroud)

导航这些变化一直很困难,但我猜我正在做.AddScheme错了.有什么建议?

编辑:这里(基本上)是一个干净的应用程序,不会在User.Identies上产生两组身份:

namespace WebApplication1.Controllers
{
    public class Testy : Controller
    {
        public IActionResult Index()
        {
            var i = HttpContext.User.Identities; …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-mvc asp.net-core asp.net-core-2.0

30
推荐指数
3
解决办法
2万
查看次数

IDX10501:签名验证失败。无法匹配键

请帮助我了解来自 ASP netcore 应用程序和 netcore Kestrel 托管应用程序的 JWT 令牌验证之间的区别。

有两个应用程序使用如下源代码验证令牌:

public static IServiceCollection AddJwtToken(this IServiceCollection services, OAuthConfig config)
{
    services.AddMvc();
    services.AddAuthorization();

    Logger.DebugFormat("AddJwtBearer authority:{0} audience:{1}", config.GetAuthority(), config.Resource);

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options => new JwtBearerOptions
        {
            Authority = config.GetAuthority(),
            Audience = config.Resource,
    });

    return services;
}
Run Code Online (Sandbox Code Playgroud)

它非常简单,如果从 asp net core 2.2 应用程序验证令牌,它就可以很好地工作

// in the asp.net core
var builder = WebHost.CreateDefaultBuilder(args);
builder
        .UseStartup<Startup>()
        .ConfigureKestrel(_ => _.ConfigureEndpoints())
        .UseSerilog();
Run Code Online (Sandbox Code Playgroud)

还有另一个应用程序(控制台)使用 UseKestrel

//in the console app
var builder = WebHost.CreateDefaultBuilder()
    .UseNLog()
    .UseKestrel(_ => _.ConfigureEndpoints())
    .UseStartup<Startup>();
Run Code Online (Sandbox Code Playgroud)

唯一的一个显着区别是UseKestrel …

c# openid azure-active-directory asp.net-core

18
推荐指数
2
解决办法
3万
查看次数

如何在asp.net core 2.0中允许多个具有不同发行者的JWT

有没有办法在单个 asp.net core 2.0 应用程序中处理来自多个颁发者的 JWT?

这是我目前检查令牌的方式:

public void ConfigureServices(IServiceCollection services)
{
    TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
    {
        // ...

        ValidateIssuer = true,
        ValidIssuer = options.Issuer, // <-- could this be a list of issuers?

        // ...
    };

    services.AddAuthentication()
        .AddJwtBearer(jwtOptions =>
        {
            jwtOptions.TokenValidationParameters = tokenValidationParameters;
        });

    services.AddAuthorization(authOptions =>
        {
            authOptions.DefaultPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme).RequireAuthenticatedUser().Build();
        });
}

public void Configure(IApplicationBuilder app)
{   
    // ...
    app.UseAuthentication();
}
Run Code Online (Sandbox Code Playgroud)

我之所以要处理多个颁发者,是因为我需要处理具有不同权限的不同用户类型。为了在微服务架构环境中只允许特定用户使用某些服务,我想为每个用户类型使用不同的发行者发行令牌。

jwt asp.net-core-2.0

8
推荐指数
1
解决办法
6880
查看次数

Firebase .NET令牌验证

处理使用Firebase进行某些数据存储的项目,我们的客户端请求使用C#.NET实现服务器.我们在服务器上设置REST端点,以便客户端能够出于某些目的与其进行通信(例如,触发只能在服务器上运行的算法).

Firebase建议我们通过ID令牌识别用户,如下所示:https://firebase.google.com/docs/auth/server/verify-id-tokens#verify_id_tokens_using_a_third-party_jwt_library

由于没有支持令牌身份验证的官方.NET Firebase服务器SDK,因此我们使用第三方JWT库来执行此操作:https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for -dotnet

根据Firebase文档中的规定,我们首先生成向服务器发送令牌.在检查令牌中的几个不同字段后,我们使用该kid字段从https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com获取公钥.

我们一直在浏览文档和StackOverflow很长一段时间,但是根据Firebase文档的规定,我们找不到使用此公钥来执行此操作的方法:

最后,确保ID令牌由与令牌的孩子声明相对应的私钥签名.从https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com获取公钥,并使用JWT库验证签名.

Firebase文档实际上没有为此提供任何解释,我们正在使用的库的文档也没有.因此,当我们给出的所有内容都是公钥时,我们甚至无法获得关于如何验证令牌是否由私钥签名的基本想法.

验证令牌是否由正确的私钥实际签名的最佳方法是什么?

c# jwt firebase firebase-authentication

7
推荐指数
2
解决办法
3728
查看次数

对来自多个来源(例如 Cognito 和 Azure)的令牌进行身份验证

我们正在开发一种 API,它允许用户通过许多不同的提供商进行身份验证。单独的提供程序不是问题,但事实证明将它们一起使用是一个挑战。

InvalidOperationException当应用程序启动时,似乎添加 1 个以上的提供者会抛出“方案已经存在:承载”。

下面是ConfigureServices函数来自Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Authority = "Value";
            options.Audience = "Value";
        })
        .AddMicrosoftIdentityWebApi(options =>
        {
            Configuration.Bind("AzureAdB2C", options);

            options.TokenValidationParameters.NameClaimType = "name";
        },
        options => { Configuration.Bind("AzureAdB2C", options); });
    
    services.AddControllers();
    services.AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder(
            JwtBearerDefaults.AuthenticationScheme)
            .RequireAuthenticatedUser()
            .Build();
    });
}
Run Code Online (Sandbox Code Playgroud)

我使用 Microsoft 示例对 Azure AD 进行身份验证作为起点。删除AddJwtBearerorAddMicrosoftIdentityWebApi调用工作正常,但我需要为我们的用例配置两个提供程序。

有没有办法在 .NET Core 3.1 或更高版本上做到这一点?

c# authentication jwt azure-ad-b2c asp.net-core

7
推荐指数
1
解决办法
398
查看次数

多种身份验证方案 ASPNET Core 3

请参阅下面的更新

我正在使用 Azure AD B2C,希望我的用户能够通过我的 Web 应用程序登录,并能够利用 JWT 不记名令牌并从移动应用程序调用 Web API 方法。

我可以让任一身份验证方案自行工作。例如,在我的startup.cs中我可以执行以下操作:

        services
            .AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
            .AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));
Run Code Online (Sandbox Code Playgroud)

其按预期工作(用户可以登录网站,但 JWT 不起作用)。

或者,我可以使用以下内容,然后只有 JWT 不记名令牌才可以工作:

        services
            .AddAuthentication(AzureADB2CDefaults.JwtBearerAuthenticationScheme)
            .AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));
Run Code Online (Sandbox Code Playgroud)

如果我想要其中任何一个工作,我可以执行以下操作(在/sf/answers/3479447331/的帮助下)

        services
            .AddAuthentication()
            .AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options))
            .AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));

        services.AddAuthorization(options =>
        {
            options.DefaultPolicy = new AuthorizationPolicyBuilder()
                                    .RequireAuthenticatedUser()
                                    .AddAuthenticationSchemes(AzureADB2CDefaults.AuthenticationScheme, AzureADB2CDefaults.JwtBearerAuthenticationScheme)
                                    .Build();
        }
Run Code Online (Sandbox Code Playgroud)

现在两者都可以工作。(编辑:实际上,它们并不能完全工作)

但是,我也有这个代码:

        app.UseAuthentication();
        app.UseMiddleware<MyAfterAuthenticatedMiddleware>();
        app.UseAuthorization();
Run Code Online (Sandbox Code Playgroud)

问题是,当我使用任一身份验证的组合时,当我的中间件代码运行时,我的用户未经过身份验证(在中间件代码中)并且没有声明等,但稍后在管道中获取它们。

这里发生了什么事?如何解决这个问题?

看来当我不指定默认身份验证方案时(为了拥有多个方案),直到管道中的授权步骤时,身份验证才会发生。

我需要我的中间件在身份验证之后和授权之前运行。如何通过多种身份验证方案实现这一点?

更新——解决了!但一定有更好的方法!

首先,我要向那些创建 .NET 安全产品的人们表示敬意。这很重要,也很困难。我确实认为可能还有很大的改进空间。

大多数开发人员在必要时都会涉足安全领域,然后又回到他们的“常规”工作中。除非你每天都使用它,否则很难保持领先。每次你回到它时,一切都会再次改变。

这一定是一个常见的场景:我希望我的用户能够登录我的网站并与各种 Web API 方法进行交互。我希望他们也能够通过其他方式访问这些相同的 API …

c# authentication jwt azure-ad-b2c asp.net-core

6
推荐指数
0
解决办法
1951
查看次数

使用 AAD B2C 中的客户端凭据授予流程的 Azure 应用服务轻松身份验证

是否可以使用内置的身份验证/授权选项来保护 Azure 应用服务中的 Web API,同时使用 OAuth 客户端凭据授予流程来访问它?

我有一个应用程序服务正在使用 Azure AD B2C 进行身份验证。在该 B2C 租户中,我注册了 Web 应用程序/API,并且身份验证工作正常,可以使用该 Web 应用程序。我在该 AD B2C 应用程序的“已发布范围”部分中添加了一个范围,并为该范围添加了一个应用程序 ID URI。然后我在租户中创建了另一个应用程序 (ClientApp) 来代表我想要提供对第一个 API 的访问的另一个服务。我为其生成了一个密钥,并且还在 API 访问部分添加了我在其他应用程序中创建的范围。

然后在邮递员中我使用下一个获取令牌

  • 授予类型:客户凭证
  • 访问令牌 URL: https: //login.microsoftonline.com/mytenantname.onmicrosoft.com/oauth2/v2.0/token(由于某种原因,我必须使用 login.microsoftonline,因为 b2clogin 域不适用于此)
  • 客户端ID:出现在为ClientApp注册的应用程序中的ID
  • Client Secret:ClientApp下生成的secret
  • 范围:我添加的Web应用程序注册的应用程序ID URI。

我成功获取了令牌,但是当我尝试使用邮递员使用不记名令牌访问网站时,我只得到 401。

azure azure-ad-b2c

5
推荐指数
1
解决办法
2306
查看次数

用于授权和认证的多个 JWT 承载

我有一个用于 SSO 的 .NET Core IdentityServer (IS),我想用它来验证我的 .NET Core(后端)-Angular(客户端)应用程序。我想通过自定义后端生成的 JWT 令牌在后端有一个 EF ApplicationUser 并在后端有基于 Claim 的授权,该令牌也适用于客户端的授权。

在后端,我创建了一个中间件来检查所有请求的“授权”标头。如果标头包含由 IS 生成的令牌,我想将其交换为包含必要声明的自定义(后端)生成的令牌。客户端然后将此标头用于对后端的后续请求。

启动配置:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
   app.UseMiddleware<AuthorizationHeaderMiddleware>();
   app.UseAuthentication();
   app.UseStaticFiles();
   app.UseMvc();
}

public void ConfigureServices(IServiceCollection services)
{
   services.AddAuthentication(DEFAULT_AUTH_SCHEME)
        .AddJwtBearer(DEFAULT_AUTH_SCHEME, cfg =>
          {
                cfg.Audience = Configuration["Authorization:JwtIssuer"];
                cfg.RequireHttpsMetadata = false;
                cfg.TokenValidationParameters = new TokenValidationParameters
                    {
                    RequireSignedTokens = false,
                    ValidateIssuer = false,
                    ValidateLifetime = false,
                    ValidateIssuerSigningKey = false,
                    ValidIssuer = Configuration["Authorization:JwtIssuer"],
                    ValidAudience = Configuration["Authorization:JwtIssuer"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Authorization:JwtKey"])),
                    RequireExpirationTime = false,
                    ClockSkew = …
Run Code Online (Sandbox Code Playgroud)

claims-based-identity asp.net-core asp.net-core-2.1

5
推荐指数
1
解决办法
772
查看次数

asp.Net core 2.2中的多种认证方式

有没有办法在 .net core 中使用 JWT 承载身份验证和自定义身份验证方法?我希望所有操作都默认为 JWT,但在少数情况下我想使用自定义身份验证标头。

authentication .net-core asp.net-core

3
推荐指数
1
解决办法
5799
查看次数