C# 通过MongoDB授权不使用ASP.NET Core 3.1标识的角色
更新:不只是管理员角色不起作用-似乎任何需要授权的路线都会返回401。 我想创建一个管理员角色来控制对AdminController的访问。对于API/Angular 9前端,我的堆栈是MongoDb/.NET内核(3.1) 我用角色为我的数据库种子C# 通过MongoDB授权不使用ASP.NET Core 3.1标识的角色,c#,mongodb,asp.net-identity,mongodb-.net-driver,C#,Mongodb,Asp.net Identity,Mongodb .net Driver,更新:不只是管理员角色不起作用-似乎任何需要授权的路线都会返回401。 我想创建一个管理员角色来控制对AdminController的访问。对于API/Angular 9前端,我的堆栈是MongoDb/.NET内核(3.1) 我用角色为我的数据库种子 private static void SeedRoles(RoleManager<MongoRole> roleManager) { if (!roleManager.RoleE
private static void SeedRoles(RoleManager<MongoRole> roleManager)
{
if (!roleManager.RoleExistsAsync("User").Result)
{
MongoRole role = new MongoRole();
role.Name = "User";
IdentityResult roleResult = roleManager.
CreateAsync(role).Result;
}
if (!roleManager.RoleExistsAsync("Admin").Result)
{
MongoRole role = new MongoRole();
role.Name = "Admin";
IdentityResult roleResult = roleManager.
CreateAsync(role).Result;
}
}
在我的启动文件中,我配置了我的mongo身份提供程序
services.AddIdentityMongoDbProvider<AspNetCore.Identity.Mongo.Model.MongoUser, AspNetCore.Identity.Mongo.Model.MongoRole>(identityOptions =>
{
identityOptions.Password.RequiredLength = 6;
identityOptions.Password.RequireLowercase = false;
identityOptions.Password.RequireUppercase = false;
identityOptions.Password.RequireNonAlphanumeric = false;
identityOptions.Password.RequireDigit = false;
}, mongoIdentityOptions => {
mongoIdentityOptions.ConnectionString = **REMOVED CONN STR FROM HERE**;
});
事实证明,造成这个错误的只是愚蠢。我硬编码了Register/Login端点的issuer和JWT密钥变量,但写得不正确 因为它们与startup.cs文件(见下文)中的issuer/jwt密钥不匹配
这意味着JWT密钥被视为无效而拒绝。很抱歉,如果有人在这方面浪费时间。客户端到服务器的连接正在使用TLS进行身份验证。默认TLS版本必须为1.2/1.3。今年6月之前的旧代码被允许使用1.0/1.1。关于设置TLS1.2,请参见以下内容:这是我需要在客户端(角度)代码上更改的设置吗?因为当我使用邮递员的时候,我会进入401账户——将客户从流程中排除,但我不能100%确定邮递员的设置在哪里。我怀疑是您的浏览器设置造成的。TLS的版本在浏览器设置中。尝试将设置更改为禁用1.0/1.1(和SSL)并仅使用1.2/1.3。我已经尝试过了,但仍然获得了401-而且我意识到,我不仅获得了管理策略的401,还获得了任何需要授权的路由在错误发生前多久?如果是30秒,您可能正在查找代理,30秒表示代理超时。您可以将代理设置为null(client.proxy=null)。您的URL使用HTTP还是HTTPS?两种都试试。在尝试使用c#之前让邮递员工作。
services.AddIdentityMongoDbProvider<AspNetCore.Identity.Mongo.Model.MongoUser, AspNetCore.Identity.Mongo.Model.MongoRole>(identityOptions =>
{
identityOptions.Password.RequiredLength = 6;
identityOptions.Password.RequireLowercase = false;
identityOptions.Password.RequireUppercase = false;
identityOptions.Password.RequireNonAlphanumeric = false;
identityOptions.Password.RequireDigit = false;
}, mongoIdentityOptions => {
mongoIdentityOptions.ConnectionString = **REMOVED CONN STR FROM HERE**;
});
// POST api/user/login
[HttpPost]
[AllowAnonymous]
public async Task<ActionResult> Login([FromBody]LoginEntity model)
{
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, false, false);
if (result.Succeeded)
{
string key = model.UserName + "ezgig321";
var appUser = _userManager.Users.SingleOrDefault(r => r.UserName == model.UserName);
var issuer = "ezgig";
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var roles = await _userManager.GetRolesAsync(appUser);
var claimList = new List<Claim>();
foreach (var role in roles)
{
var roleClaim = new Claim(ClaimTypes.Role, role);
claimList.Add(roleClaim);
}
claimList.Add(new Claim("username", model.UserName));
//var token = AuthenticationHelper.GenerateJwtToken(model.Email, appUser, _configuration);
var token = new JwtSecurityToken(issuer, //Issure
issuer, //Audience
claimList,
expires: DateTime.Now.AddDays(1),
signingCredentials: credentials);
var encodedJwt = new JwtSecurityTokenHandler().WriteToken(token);
var rootData = new LoginResponse(encodedJwt, appUser.UserName);
return Ok(rootData);
}
return StatusCode((int)HttpStatusCode.Unauthorized, "Bad Credentials");
}
string errorMessage = string.Join(", ", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage));
return BadRequest(errorMessage ?? "Bad Request");
}
[Authorize(Roles ="Admin")]
[Route("api/[controller]/[action]")]
public class AdminController : Controller
{
// GET api/admin/admintest
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[HttpGet]
public ActionResult AdminTest()
{
return Ok("you seem to have admin authorisation");
}
services.AddAuthentication(options =>
{
//Set default Authentication Schema as Bearer
options.DefaultAuthenticateScheme =
JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme =
JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme =
JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(cfg =>
{
cfg.RequireHttpsMetadata = false;
cfg.SaveToken = true;
cfg.TokenValidationParameters =
new TokenValidationParameters
{
ValidIssuer = Configuration["JwtIssuer"],
ValidAudience = Configuration["JwtIssuer"],
IssuerSigningKey =
new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtKey"])),
ClockSkew = TimeSpan.Zero // remove delay of token when expire
};
});