【问题标题】:Simple Authentication using Jwt in dot net core MVC在 dot net core MVC 中使用 Jwt 进行简单身份验证
【发布时间】:2017-11-05 21:50:25
【问题描述】:

我正在尝试在我的 dot net core 应用程序中添加 JWT 验证。我已经关注this link 来了解 JWT 并能够通过提供一些这样的值来生成令牌。

var token = new JwtSecurityToken(
  issuer: issuer,
  audience: aud,
  claims: claims,
  expires: expTime,
  signingCredentials: creds
);

编辑:并关注this answer,我还添加了JwtBearerAuthentication middleware in my app by adding app.UseJwtBearerAuthentication(new JwtBearerOptions { /* options */ }) to Startup.Configure() method

现在我被困住了,我怎么能在 HTTP 标头中传递这个令牌?我在登录时生成此令牌,但接下来是什么?我怎么知道添加了 JWT 并且工作正常??

我们将不胜感激。

【问题讨论】:

    标签: model-view-controller asp.net-core jwt


    【解决方案1】:

    这是 ASP.NET Core 中承载令牌身份验证的可运行示例。
    How to achieve a bearer token authentication and authorization in ASP.NET Core

    在后端,您可以按照以下代码生成令牌:

    [Route("api/[controller]")]
    public class TokenAuthController : Controller
    {
        [HttpPost]
        public string GetAuthToken(User user)
        {
            var existUser = UserStorage.Users.FirstOrDefault(u => u.Username == user.Username && u.Password == user.Password);
    
            if (existUser != null)
            {
                var requestAt = DateTime.Now;
                var expiresIn = requestAt + TokenAuthOption.ExpiresSpan;
                var token = GenerateToken(existUser, expiresIn);
    
                return JsonConvert.SerializeObject(new {
                    stateCode = 1,
                    requertAt = requestAt,
                    expiresIn = TokenAuthOption.ExpiresSpan.TotalSeconds,
                    accessToken = token
                });
            }
            else
            {
                return JsonConvert.SerializeObject(new { stateCode = -1, errors = "Username or password is invalid" });
            }
        }
    
        private string GenerateToken(User user, DateTime expires)
        {
            var handler = new JwtSecurityTokenHandler();
    
            ClaimsIdentity identity = new ClaimsIdentity(
                new GenericIdentity(user.Username, "TokenAuth"),
                new[] {
                    new Claim("ID", user.ID.ToString())
                }
            );
    
            var securityToken = handler.CreateToken(new SecurityTokenDescriptor
            {
                Issuer = TokenAuthOption.Issuer,
                Audience = TokenAuthOption.Audience,
                SigningCredentials = TokenAuthOption.SigningCredentials,
                Subject = identity,
                Expires = expires
            });
            return handler.WriteToken(securityToken);
        }
    }
    

    在 Startup.cs/ConfigureServices 方法中

    services.AddAuthorization(auth =>
    {
        auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
            .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme‌​)
            .RequireAuthenticatedUser().Build());
    });
    

    并在配置方法中添加此代码

    app.UseJwtBearerAuthentication(new JwtBearerOptions {
        TokenValidationParameters = new TokenValidationParameters {
            IssuerSigningKey = TokenAuthOption.Key,
            ValidAudience = TokenAuthOption.Audience,
            ValidIssuer = TokenAuthOption.Issuer,
            ValidateIssuerSigningKey = true,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.FromMinutes(0)
        }
    });
    

    在前端,您只需将令牌添加到标题中,如下所示:

    $.ajaxSetup({
        headers: { "Authorization": "Bearer " + accessToken }
    });
    

    $.ajax("http://somedomain/somepath/somepage",{
        headers:{ "Authorization": "Bearer " + accessToken },
        /*some else parameter for ajax, see more you can review the Jquery API*/
    });
    

    【讨论】:

    • 从哪里以及如何获得 accessToken??
    • 您可以从代码示例中找到Controllers/TokenAuthController.cs中的代码。
    • 有没有办法通过剃刀语法来实现这个解决方案?哪里没有 ajax 调用?
    • 浏览器的表单请求中不能添加http头。但是您可以在浏览器中将令牌设置为cookie,在服务器端添加一个中间件以通过cookie设置httpheader。
    • 也许您应该为 web jwt 网页身份验证创建另一个问题。
    猜你喜欢
    • 2020-01-30
    • 2017-04-15
    • 2017-11-28
    • 2018-07-04
    • 2019-06-24
    • 2023-04-01
    • 2017-07-09
    • 2019-12-24
    • 2019-04-24
    相关资源
    最近更新 更多