Visual Studio -> Create New Project -> Asp.Net Core Web application -> API


Right-click on project -> Manage NuGet package -> On browse section search for (Microsoft.AspNetCore.Authentication.JwtBearer) -> install.


UserController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Logging;
namespace JwtNetCore
{
[Route("[controller]")]
[ApiController]
public class UserController : ControllerBase
{
[HttpGet]
[Route("GetUserData")]
[Authorize(Policy = Policies.User)]
public IActionResult GetUserData()
{
return Ok("This is a response from user method");
}
[HttpGet]
[Route("GetAdminData")]
[Authorize(Policy = Policies.Admin)]
public IActionResult GetAdminData()
{
return Ok("This is a response from Admin method");
}
}
}
LoginController
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens;
namespace JwtNetCore
{
[Route("[controller]")]
[ApiController]
public class LoginController : ControllerBase
{
private readonly IConfiguration _config;
private List<User> appUsers = new List<User>{
new User { FullName = "Vaibhav Bhapkar", UserName = "admin", Password = "1234", UserRole = "Admin" },
new User { FullName = "Test User", UserName = "user", Password = "1234", UserRole = "User" }
};
public LoginController(IConfiguration config)
{
_config = config;
}
[HttpPost]
[AllowAnonymous]
public IActionResult Login([FromBody] User login)
{
IActionResult response = Unauthorized();
User user = AuthenticateUser(login);
if (user != null)
{
var tokenString = GenerateJWTToken(user);
response = Ok(new
{
token = tokenString,
userDetails = user,
});
}
return response;
}
User AuthenticateUser(User loginCredentials)
{
User user = appUsers.SingleOrDefault(x => x.UserName == loginCredentials.UserName && x.Password == loginCredentials.Password);
return user;
}
string GenerateJWTToken(User userInfo)
{
//var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt: SecretKey"]));
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("xecretKeywqejane"));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, userInfo.UserName),
new Claim("fullName", userInfo.FullName.ToString()),
new Claim("role",userInfo.UserRole),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
};
var token = new JwtSecurityToken(
//"https://localhost:44349"
issuer: "http://localhost:44349",
audience: "http://localhost:44349",
//issuer: _config["Jwt: Issuer"],
//audience: _config["Jwt: Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: credentials
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
}
User
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace JwtNetCore
{
public class User
{
public string UserName { get; set; }
public string FullName { get; set; }
public string Password { get; set; }
public string UserRole { get; set; }
}
}
Policies
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
namespace JwtNetCore
{
public class Policies
{
public const string Admin = "Admin";
public const string User = "User";
public static AuthorizationPolicy AdminPolicy()
{
return new AuthorizationPolicyBuilder().RequireAuthenticatedUser().RequireRole(Admin).Build();
}
public static AuthorizationPolicy UserPolicy()
{
return new AuthorizationPolicyBuilder().RequireAuthenticatedUser().RequireRole(User).Build();
}
}
}
appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Jwt": {
"SecretKey": "xecretKeywqejane",
"Issuer": "https://localhost:44349",
"Audience": "https://localhost:44349"
}
}
Startup
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens;
namespace JwtNetCore
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters();
options.TokenValidationParameters.ValidateIssuer = true;
options.TokenValidationParameters.ValidateAudience = true;
options.TokenValidationParameters.ValidateLifetime = true;
options.TokenValidationParameters.ValidateIssuerSigningKey = true;
//options.TokenValidationParameters.ValidIssuer = Configuration["Jwt: Issuer"];
options.TokenValidationParameters.ValidIssuer = "http://localhost:44349";
//options.TokenValidationParameters.ValidAudience = Configuration["Jwt: Audience"];
options.TokenValidationParameters.ValidAudience = "http://localhost:44349";
//options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt: SecretKey"]));
options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("xecretKeywqejane"));
options.TokenValidationParameters.ClockSkew = TimeSpan.Zero;
});
services.AddAuthorization(config =>
{
config.AddPolicy(Policies.Admin, Policies.AdminPolicy());
config.AddPolicy(Policies.User, Policies.UserPolicy());
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}

401

Admin 200

Reference,
https://jwt.io/
https://medium.com/@vaibhavrb999/jwt-authentication-authorization-in-net-core-3-1-e762a7abe00a
https://blog.miniasp.com/post/2019/12/16/How-to-use-JWT-token-based-auth-in-aspnet-core-31
留言
張貼留言