Ich arbeite an einer API mit ASP.NET Core 3.1 und habe mehrere Controller erstellt. Diese API verwendet ein JWT -Bearer -Token, um den Anrufer zu authentifizieren, wobei Logintroller drei Endpunkte Login , Fehler und Menulist (Liste der Menüs gemäß der Rolle) enthält. Nur dieser Controller funktioniert einwandfrei wie der Menulist gibt einen HTTP 401 -Fehler zurück, wenn der Benutzer nicht angemeldet ist, und wenn der Benutzer angemeldet ist, funktioniert er so, wie es sollte. />
TypeError: Versäumt, < /p>
< /blockquote>
zu holen Ich habe versucht, dieses Problem lokal zu debuggen, aber die Anfrage trifft nicht einmal die Funktion "Controller", wie ich den Breakpoint auf den Controller findet, um herauszufinden, wo das Problem nicht zu einem Withan -Withan -Withan -Wachstum ist. Abrufen Daten normal.
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using BAL.Interfaces;
using ViewModel.Model;
using Microsoft.AspNetCore.Identity;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using Microsoft.AspNetCore.Authorization;
using System.Text;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Http;
using DAL.DBEntities;
using Newtonsoft.Json;
using Microsoft.Extensions.Logging;
using ViewModel.vt_Common;
namespace IndigoAPI.Controllers
{
public class LoginController : BaseController
{
#region StructureWork
private readonly ILoginRepository LoginRepository; // Login Repository Interface
public readonly UserManager userManager; // ASP Identity
private readonly RoleManager roleManager; // ASP Identity
private readonly IConfiguration _configuration; // Configuration property
private readonly ILogger _logger; // Logger Dependance Injection
private readonly IExceptionRepository ExceptionRepository; // for exception log
public LoginController(ILogger logger, UserManager userManager, RoleManager roleManager, IExceptionRepository ExceptionRepository, IConfiguration configuration, ILoginRepository LoginRepository)
{
this.LoginRepository = LoginRepository;
this.ExceptionRepository = ExceptionRepository;
this.userManager = userManager;
this.roleManager = roleManager;
_configuration = configuration;
_logger = logger;
}
#endregion
// me
///
/// This method is created to authenticate user and return token.
/// This method uses asp authentication
///
///
///
[HttpPost]
[Route("Login")]
[AllowAnonymous]
public async Task Login([FromBody] LoginForm Header)
{
try
{
if (ModelState.IsValid)
{
var user = await userManager.FindByNameAsync(Header.UserName); // find user name
var userRoles = await userManager.GetRolesAsync(user); // get role
if (userRoles.Count > 0)
{
if (user != null && await userManager.CheckPasswordAsync(user, Header.Password))
{
if (await LoginRepository.IsUserActive(Header.UserName) != null)
{
List menulist = new List();
menulist = await LoginRepository.getMenuList_byRole(userRoles[0]); // get menu list from repo
List userPages = new List();
userPages = await LoginRepository.getPageListByRole(userRoles[0]);
UserPagesList.List = userPages;
var jsonstr = JsonConvert.SerializeObject(userPages);
TempData["UserPages"] = jsonstr;
if (menulist != null)
{
#region Claims
var hashPassword = await LoginRepository.getUserHashPassword(user.Id);
var password = vt_Common.DecryptCipherTextToPlainText(hashPassword);
#endregion
var authClaims = new List
{
new Claim(ClaimTypes.Name, user.UserName),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
}; // create claims
foreach (var userRole in userRoles)
{
authClaims.Add(new Claim(ClaimTypes.Role, userRole));
} // add roles in claims
string menu = "http://foo.it/claim/menulist";
authClaims.Add(new Claim(menu, JsonConvert.SerializeObject(menulist))); // add menulist in claims
string pages = "http://foo.it/claim/pages";
authClaims.Add(new Claim(pages, JsonConvert.SerializeObject(userPages))); // add menulist in claims
var authSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:Secret"])); // create key
var token = new JwtSecurityToken(
issuer: _configuration["JWT:ValidIssuer"],
audience: _configuration["JWT:ValidAudience"],
expires: DateTime.Now.AddHours(3),
claims: authClaims,
signingCredentials: new SigningCredentials(authSigningKey, SecurityAlgorithms.HmacSha256)
); // create token
await LoginRepository.LastLogin(Header.UserName, this.HttpContext.Connection.RemoteIpAddress.ToString());
return Ok(new
{
token = new JwtSecurityTokenHandler().WriteToken(token),
expiration = token.ValidTo,
ID = user.Id,
UserName = user.UserName,
Role = userRoles[0],
Menulist = menulist
}); // return
}
else
{
return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "No Menu Found." });
}
}
else
{
return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "User is not active." });
}
}
else
{
return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "Wrong user name or password." });
}
}
else
{
return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "Role Not Exist." });
}
}
else
{
return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "Fill the Required Fields." });
}
}
catch (Exception ex)
{
await ExceptionRepository.writeException(Controller(), ex.Message, CurrentUser.UserName, CurrentUser.UserIP);
return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = ex.Message });
}
}
///
/// If user requested to unauthorized method this method will hit
///
///
[HttpGet]
[Route("error")]
public async Task Error()
{
return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "Unauthorized." });
}
///
/// This method return menulist
///
///
[HttpGet]
[Route("MenuList")]
public async Task MenuList()
{
try
{
List menulist = new List();
menulist = await LoginRepository.getMenuList_byRole(CurrentUser.RoleName); // get menu list from repo
return Json(new { status = true, data = menulist });
}
catch (Exception ex)
{
await ExceptionRepository.writeException(Controller(), ex.Message, CurrentUser.UserName, CurrentUser.UserIP);
return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = ex.Message });
}
}
}
}
< /code>
UserController
: In diesem Controller wird GetUser keine Daten abgerufen, sondern GetRoles aufgrund der deglierigen Annotation:
Ich arbeite an einer API mit ASP.NET Core 3.1 und habe mehrere Controller erstellt. Diese API verwendet ein JWT -Bearer -Token, um den Anrufer zu authentifizieren, wobei Logintroller drei Endpunkte Login , Fehler und Menulist (Liste der Menüs gemäß der Rolle) enthält. Nur dieser Controller funktioniert einwandfrei wie der Menulist gibt einen HTTP 401 -Fehler zurück, wenn der Benutzer nicht angemeldet ist, und wenn der Benutzer angemeldet ist, funktioniert er so, wie es sollte. /> TypeError: Versäumt, < /p> < /blockquote> zu holen Ich habe versucht, dieses [url=viewtopic.php?t=20324]Problem[/url] lokal zu debuggen, aber die Anfrage trifft nicht einmal die Funktion "Controller", wie ich den Breakpoint auf den Controller findet, um herauszufinden, wo das [url=viewtopic.php?t=20324]Problem[/url] nicht zu einem Withan -Withan -Withan -Wachstum ist. Abrufen Daten normal.[code]LoginController[/code]: [code]using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Threading.Tasks; using BAL.Interfaces; using ViewModel.Model; using Microsoft.AspNetCore.Identity; using System.Security.Claims; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using Microsoft.AspNetCore.Authorization; using System.Text; using Microsoft.Extensions.Configuration; using Microsoft.AspNetCore.Http; using DAL.DBEntities; using Newtonsoft.Json; using Microsoft.Extensions.Logging; using ViewModel.vt_Common;
namespace IndigoAPI.Controllers { public class LoginController : BaseController { #region StructureWork private readonly ILoginRepository LoginRepository; // Login Repository Interface public readonly UserManager userManager; // ASP Identity private readonly RoleManager roleManager; // ASP Identity private readonly IConfiguration _configuration; // Configuration property private readonly ILogger _logger; // Logger Dependance Injection private readonly IExceptionRepository ExceptionRepository; // for exception log
// me /// /// This method is created to authenticate user and return token. /// This method uses asp authentication /// ///
/// [HttpPost] [Route("Login")] [AllowAnonymous] public async Task Login([FromBody] LoginForm Header) { try { if (ModelState.IsValid) { var user = await userManager.FindByNameAsync(Header.UserName); // find user name
var userRoles = await userManager.GetRolesAsync(user); // get role
if (userRoles.Count > 0) { if (user != null && await userManager.CheckPasswordAsync(user, Header.Password)) { if (await LoginRepository.IsUserActive(Header.UserName) != null) { List menulist = new List(); menulist = await LoginRepository.getMenuList_byRole(userRoles[0]); // get menu list from repo
List userPages = new List(); userPages = await LoginRepository.getPageListByRole(userRoles[0]); UserPagesList.List = userPages; var jsonstr = JsonConvert.SerializeObject(userPages); TempData["UserPages"] = jsonstr;
if (menulist != null) { #region Claims var hashPassword = await LoginRepository.getUserHashPassword(user.Id); var password = vt_Common.DecryptCipherTextToPlainText(hashPassword); #endregion
var authClaims = new List { new Claim(ClaimTypes.Name, user.UserName), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), }; // create claims
foreach (var userRole in userRoles) { authClaims.Add(new Claim(ClaimTypes.Role, userRole)); } // add roles in claims
string menu = "http://foo.it/claim/menulist"; authClaims.Add(new Claim(menu, JsonConvert.SerializeObject(menulist))); // add menulist in claims
return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token), expiration = token.ValidTo, ID = user.Id, UserName = user.UserName, Role = userRoles[0], Menulist = menulist }); // return } else { return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "No Menu Found." }); } } else { return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "User is not active." }); } } else { return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "Wrong user name or password." }); } } else { return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "Role Not Exist." }); } } else { return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "Fill the Required Fields." }); } } catch (Exception ex) { await ExceptionRepository.writeException(Controller(), ex.Message, CurrentUser.UserName, CurrentUser.UserIP); return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = ex.Message }); } }
/// /// If user requested to unauthorized method this method will hit /// /// [HttpGet] [Route("error")] public async Task Error() { return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "Unauthorized." }); }
/// /// This method return menulist /// /// [HttpGet] [Route("MenuList")] public async Task MenuList() { try { List menulist = new List(); menulist = await LoginRepository.getMenuList_byRole(CurrentUser.RoleName); // get menu list from repo return Json(new { status = true, data = menulist }); } catch (Exception ex) { await ExceptionRepository.writeException(Controller(), ex.Message, CurrentUser.UserName, CurrentUser.UserIP); return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = ex.Message }); } } } } < /code> UserController[/code]: In diesem Controller wird GetUser keine Daten abgerufen, sondern GetRoles aufgrund der deglierigen Annotation: [code]using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; using BAL.Interfaces; using DAL.DBEntities; using Microsoft.Extensions.Logging; using ViewModel.Model; using Microsoft.AspNetCore.Http; using System; using ViewModel.vt_Common; using Microsoft.AspNetCore.Authorization;
namespace IndigoAPI.Controllers { public class UserController : BaseController { #region StructureWork private readonly IUserRepository UserRepository; // Login Repository Interface public readonly UserManager userManager; // ASP Identity private readonly RoleManager roleManager; // ASP Identity private readonly ILogger _logger; // Logger Dependance Injection private readonly IExceptionRepository ExceptionRepository; // for exception log
/// /// This method will return user list /// /// [HttpGet] [Route("GetUser")] public async Task GetUser() { try { List roles = new List(); roles = await UserRepository.getUser(); return Json(new { status = true, data = roles }); } catch (Exception ex) { await ExceptionRepository.writeException(Controller(), ex.Message, CurrentUser.UserName, CurrentUser.UserIP); return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = ex.Message }); } }
/// /// This method will return role list /// /// [HttpGet] [Route("GetRole")] [AllowAnonymous] public async Task GetRole() { try { List roles = new List(); roles = await UserRepository.getRole(); return Json(new { status = true, data = roles }); } catch (Exception ex) { await ExceptionRepository.writeException(Controller(), ex.Message, CurrentUser.UserName, CurrentUser.UserIP); return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = ex.Message }); } }
/// /// This method will register users /// ///
/// [HttpPost] [Route("CreateUser")] public async Task CreateUser([FromBody] RegisterModel model) { try { var userExists = await userManager.FindByNameAsync(model.UserName); //check user exist or not
if (userExists != null) return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "Error", Message = "User already exists!" });
ApplicationUser user = new ApplicationUser() { Email = model.UserEmail, SecurityStamp = Guid.NewGuid().ToString(), UserName = model.UserName };
var result = await userManager.CreateAsync(user, model.UserPassword); //create user
if (result.Succeeded) { if (await roleManager.RoleExistsAsync(model.RoleName)) { if (await roleManager.RoleExistsAsync(model.RoleName)) { await userManager.AddToRoleAsync(user, model.RoleName); //link role and user
/// /// this method will update user /// /// /// [HttpPut] [Route("UpdateUser")] public async Task UpdateUser([FromBody] RegisterModel model) { try { var olduserExists = await userManager.FindByIdAsync(model.ASPUserID); var newUserExist = await userManager.FindByNameAsync(model.UserName);
if (olduserExists != null) { if (newUserExist == null || olduserExists == newUserExist) { model.UserPassword = ""; await UserRepository.createUpdateUser(model, model.ASPUserID, CurrentUser.UserName, CurrentUser.UserIP); //add user } else { return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "User already exist" }); } } else { return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = "User not exist" }); }
return Ok(new Response { Status = "Success", Message = "User updated successfully!" }); } catch (Exception ex) { await ExceptionRepository.writeException(Controller(), ex.Message, CurrentUser.UserName, CurrentUser.UserIP); return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "false", Message = ex.Message }); } } } } < /code> Startup.cs[/code]: [code]using DAL.DBEntities; using IndigoAPI.Services; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using System; using System.Text; using System.Threading.Tasks;
namespace IndigoAPI { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; }
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddControllersWithViews(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "IndigoAPI", Version = "v1" });
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "Please enter JWT token in the field", Name = "Authorization", Type = SecuritySchemeType.ApiKey }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new string[] {} } }); });
app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } } < /code> BaseController[/code]: [code]using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using ViewModel.Model; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Authentication; using System.Data; using ViewModel.vt_Common; using System.Collections.Generic; using System.Linq; using System; using DAL.Repositories;
namespace IndigoAPI.Controllers { [ApiController] [Route("api/[controller]"), Authorize] public class BaseController : Controller { private string Token; private UserProfile User;
public UserProfile CurrentUser { get { User = new UserProfile(); User.UserName = vt_Common.getUserNameFromToken(Token); User.RoleName = vt_Common.getUserRoleFromToken(Token); User.UserIP = this.HttpContext.Connection.RemoteIpAddress.ToString(); User.MenuList = vt_Common.getMenuListDataTableFromJson(Token); User.UserPages = vt_Common.getUserPagesDataTableFromJson(Token); return User; } set { User = value; } }
Ich bin Anfänger in regulären Ausdrücken.
Kann mir jemand helfen, den folgenden regulären Ausdruck in .NET 9.0? var regex = new Regex( (\\[)[^ ]+?( )({.*?})({(?s:.)})?(\\]) );
Ich versuche, den Firefox -Browser von einem Ubuntu -Server an meinen Windows 11 -PC zu leiten. ~$ firefox help.html
Unable to init server: Broadway display type not supported: localhost:10.0
Error:...
Ich habe eine ASP.NET Core 6 -Web -API. Es ist öffentlich. Ich habe das eingerichtet:
public void ConfigureServices( IServiceCollection services )
{
services.AddMvc(options =>...
Ich habe erfolgreich eine ASP.NET-Anwendung erstellt, die ZATCA .NET SDK (Saudi-Arabien-E-Invoicing) zum Erstellen und Signieren von XML-Dateien verwendet. In ASP.NET funktioniert alles gut mit dem...
Ich brauche einige Anleitungen für das inkrementelle Migrationsaufbau mit Yarp -Proxy, insbesondere für die Einrichtung der Struktur in IIS. /> Virtuelle App auf Subdomain Customer1.domain.com -...