gpt4 book ai didi

c# - ASP.NET Core 中基于 token 的身份验证

转载 作者:IT王子 更新时间:2023-10-29 03:31:20 27 4
gpt4 key购买 nike

我正在使用 ASP.NET Core 应用程序。我正在尝试实现基于 token 的身份验证,但不知道如何使用新的 Security System对于我的情况。我经历了examples但他们对我帮助不大,他们要么使用 cookie 身份验证,要么使用外部身份验证(GitHub、Microsoft、Twitter)。

我的场景是:angularjs 应用程序应该请求 /token url 传递用户名和密码。 WebApi 应授权用户并返回 access_token,angularjs 应用程序将在后续请求中使用它。

我找到了关于在当前版本的 ASP.NET 中实现我所需要的内容的好文章 - Token Based Authentication using ASP.NET Web API 2, Owin, and Identity .但我不清楚如何在 ASP.NET Core 中做同样的事情。

我的问题是:如何配置 ASP.NET Core WebApi 应用程序以使用基于 token 的身份验证?

最佳答案

.Net Core 3.1 更新:

David Fowler(ASP .NET Core 团队的架构师)组合了一组非常简单的任务应用程序,包括 simple application demonstrating JWT .我很快就会将他的更新和简单化的风格融入到这篇文章中。

针对 .Net Core 2 更新:

此答案的先前版本使用 RSA;如果您生成 token 的相同代码也在验证 token ,那真的没有必要。但是,如果您要分配责任,您可能仍想使用 Microsoft.IdentityModel.Tokens.RsaSecurityKey 的实例来执行此操作。 .

  1. 创建一些我们稍后会用到的常量;这是我所做的:

    const string TokenAudience = "Myself";
    const string TokenIssuer = "MyProject";
  2. 将此添加到您的 Startup.cs 的 ConfigureServices .稍后我们将使用依赖注入(inject)来访问这些设置。我假设你的 authenticationConfigurationConfigurationSectionConfiguration对象,这样您就可以为调试和生产使用不同的配置。确保安全地存储您的 key !它可以是任何字符串。

    var keySecret = authenticationConfiguration["JwtSigningKey"];
    var symmetricKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(keySecret));

    services.AddTransient(_ => new JwtSignInHandler(symmetricKey));

    services.AddAuthentication(options =>
    {
    // This causes the default authentication scheme to be JWT.
    // Without this, the Authorization header is not checked and
    // you'll get no results. However, this also means that if
    // you're already using cookies in your app, they won't be
    // checked by default.
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
    options.TokenValidationParameters.ValidateIssuerSigningKey = true;
    options.TokenValidationParameters.IssuerSigningKey = symmetricKey;
    options.TokenValidationParameters.ValidAudience = JwtSignInHandler.TokenAudience;
    options.TokenValidationParameters.ValidIssuer = JwtSignInHandler.TokenIssuer;
    });

    我看到其他答案更改了其他设置,例如 ClockSkew ;默认设置使其适用于时钟不完全同步的分布式环境。这些是您唯一需要更改的设置。

  3. 设置身份验证。你应该在任何需要你的中间件之前有这行 User信息,例如 app.UseMvc() .

    app.UseAuthentication();

    请注意,这不会导致您的 token 与 SignInManager 一起发出或其他任何东西。您需要提供自己的 JWT 输出机制 - 见下文。

  4. 您可能想要指定一个 AuthorizationPolicy .这将允许您使用 [Authorize("Bearer")] 指定仅允许 Bearer token 作为身份验证的 Controller 和操作。 .

    services.AddAuthorization(auth =>
    {
    auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
    .AddAuthenticationTypes(JwtBearerDefaults.AuthenticationType)
    .RequireAuthenticatedUser().Build());
    });
  5. 棘手的部分来了:构建 token 。

    class JwtSignInHandler
    {
    public const string TokenAudience = "Myself";
    public const string TokenIssuer = "MyProject";
    private readonly SymmetricSecurityKey key;

    public JwtSignInHandler(SymmetricSecurityKey symmetricKey)
    {
    this.key = symmetricKey;
    }

    public string BuildJwt(ClaimsPrincipal principal)
    {
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

    var token = new JwtSecurityToken(
    issuer: TokenIssuer,
    audience: TokenAudience,
    claims: principal.Claims,
    expires: DateTime.Now.AddMinutes(20),
    signingCredentials: creds
    );

    return new JwtSecurityTokenHandler().WriteToken(token);
    }
    }

    然后,在您想要 token 的 Controller 中,如下所示:

    [HttpPost]
    public string AnonymousSignIn([FromServices] JwtSignInHandler tokenFactory)
    {
    var principal = new System.Security.Claims.ClaimsPrincipal(new[]
    {
    new System.Security.Claims.ClaimsIdentity(new[]
    {
    new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Name, "Demo User")
    })
    });
    return tokenFactory.BuildJwt(principal);
    }

    在这里,我假设您已经有了校长。如果您使用身份,则可以使用 IUserClaimsPrincipalFactory<> 改造你的 User进入ClaimsPrincipal .

  6. 测试:获取 token ,将其放入 jwt.io 的表单中.我上面提供的说明还允许您使用配置中的 secret 来验证签名!

  7. 如果您在 HTML 页面的部分 View 中呈现它并结合 .Net 4.5 中的仅承载身份验证,您现在可以使用 ViewComponent做同样的事情。它与上面的 Controller Action 代码基本相同。

关于c# - ASP.NET Core 中基于 token 的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29048122/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com