在AuthController身份验证时,我创建了几个声明 - UserID就是其中之一.
...
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, user.UserName),
new Claim("UserID", user.Id.ToString()),
})
Run Code Online (Sandbox Code Playgroud)
当Angular应用程序发出请求时,我可以UserID在另一个控制器中获取
Claim claimUserId = User.Claims.SingleOrDefault(c => c.Type == "UserID");
Run Code Online (Sandbox Code Playgroud)
该ControllerBase.User实例包含.Identity对象则持有Claims集合.
Identity.IsAuthenticated等于True.
Identity.Name保存admin字符串(相关用户的名称).
如果我尝试像这样获取用户:
var user = await UserManager.GetUserAsync(HttpContext.User)
Run Code Online (Sandbox Code Playgroud)
的user是null.
也许,我忘了添加一些额外的索赔?
或者,也许,一旦我使用JWT - 我应该覆盖默认UserManager功能,以便它获取用户claim保持UserID?
或者可能有更好的方法?
附加信息:
该Identity注册如下
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<AppDbContext>()
.AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)
ApplicationUser.Id字段是bigint(或在C#中 …
我想在Linux下运行ASP.NET Core解决方案,使其在启动时运行。
从Microsoft 文档来看,有两种方法:Apache和Nginx。
两种方法都涉及代理通行证,例如
阿帕奇:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
....
Run Code Online (Sandbox Code Playgroud)
Nginx:
server {
listen 80;
server_name example.com *.example.com;
location / {
proxy_pass http://localhost:5000;
...
Run Code Online (Sandbox Code Playgroud)
由于Apache或Nginx仅充当代理-我是否正确,必须手动启动dotnet应用程序?
我在文档中看不到有什么地方可以触发dotnet run针对我的WebApi项目的命令。
显然,Apache或Nginx不会处理触发dotnet应用程序的问题-除非我错过了一些事情。
有没有一种方法可以在OS启动时自动启动应用程序?
我使用ASP.NET Core 2.1并希望User在服务级别获取.
我已经看到了HttpContextAccessor注入某个服务然后我们获取当前User通道的示例UserManager
var user = await _userManager.GetUserAsync(accessor.HttpContext.User);
Run Code Online (Sandbox Code Playgroud)
或在控制器中
var user = await _userManager.GetUserAsync(User);
Run Code Online (Sandbox Code Playgroud)
问题:
注入HttpContextAccessor服务似乎是错误的 - 仅仅因为我们违反了SRP并且服务层没有被隔离(它依赖于http上下文).
我们当然可以在控制器中获取用户(一种更好的方法),但我们面临两难 - 我们根本不想User在每个服务方法中作为参数传递
我花了几个小时思考如何最好地实现它,并提出了一个解决方案.我不完全确定我的方法是否足够,并且不违反任何软件设计原则.
共享我的代码希望从StackOverflow社区获得建议.
这个想法如下:
首先,我介绍SessionProvider哪些注册为Singleton.
services.AddSingleton<SessionProvider>();
Run Code Online (Sandbox Code Playgroud)
SessionProvider具有Session用于保持属性User,Tenant等等.
其次,我介绍SessionMiddleware并注册它
app.UseMiddleware<SessionMiddleware>();
Run Code Online (Sandbox Code Playgroud)
在Invoke我解决的方法中HttpContext,SessionProvider&UserManager.
我拿 User
然后我初始化单身人士的Session属性ServiceProvider:
sessionProvider.Initialise(user);
在这个阶段ServiceProvider …
我利用 ASP.NET Core 2.1.1
有趣的是,过期时间只被考虑到,当一个提供两个 ClockSkew - 在Startup.cs 和 JwtSecurityTokenHandler.TokenLifetimeInMinutes - 在控制器.
例如:
services
.AddJwtBearer(x =>
{
...
x.TokenValidationParameters = new TokenValidationParameters()
{
ClockSkew = TimeSpan.FromMinutes(90),
...
Run Code Online (Sandbox Code Playgroud)
加
...
public async Task<AuthenticateOutput> Authenticate([FromBody] AuthenticateInput input)
{
var tokenHandler = new JwtSecurityTokenHandler();
tokenHandler.TokenLifetimeInMinutes = (int)TimeSpan.FromMinutes(90).TotalMinutes;
...
Run Code Online (Sandbox Code Playgroud)
如果我删除tokenHandler.TokenLifetimeInMinutes = (int)TimeSpan.FromMinutes(90).TotalMinutes;
部分 - 使用默认的到期时间.
在我看来,这仍然tokenHandler.TokenLifetimeInMinutes是多余的,我只是误解了如何正确设置到期时间的概念.
我也试过添加到期声明 - new Claim(ClaimTypes.Expiration, ...)但这没有太大作用.
我面临的问题是 pgAdmin 4 中的 SQL 查询。
实体框架(包括其核心版本)将表和列的名称大写。
这意味着你的 SQL 将类似于
select e."Id", e."Text" from "Entries" e
where e."Text" like '%implicated%'
Run Code Online (Sandbox Code Playgroud)
我在谷歌上搜索防止实体框架大写名称的方法,但没有找到太多信息。
是否有解决方法可以避免将表名和列名用引号引起来?
提前致谢!
我正在尝试将 TenantProvider 注入 DbContext
public class AppDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, long>
{
public int? _tenantId;
public ITenantProvider _tenantProvider;
public AppDbContext(
DbContextOptions<AppDbContext> options,
ITenantProvider tenantProvider
)
: base(options)
{
_tenantProvider = tenantProvider;
}
Run Code Online (Sandbox Code Playgroud)
但我不明白如何正确注册它 - 如果我将断点放在构造函数中 -tenantProvider是null。
该位来自Startup.cs
services.AddDbContext<AppDbContext>(options => AppDbContextOptionsBuilder.Get());
Run Code Online (Sandbox Code Playgroud)
需要下一行将其注入DbContext控制器或服务(如果我将其ServiceLifetime.Scoped作为第二个参数添加到上面的方法中AddDbContext- 该功能不起作用):
services.AddScoped(p => new AppDbContext(AppDbContextOptionsBuilder.Get(), p.GetService<ITenantProvider>()));
Run Code Online (Sandbox Code Playgroud)
(Entity Framework是我的解决方案中的一个单独的项目)
当使用.AddScoped方法时 - 我们可以TenantProvider通过使用.GetService方法解析它来传递给构造函数。
有谁知道如何解决TenantProvider方法.AddDbContext?
附加信息:
我试图ITenantProvider在构造函数中替换 …
entity-framework dependency-injection inversion-of-control entity-framework-core asp.net-core
我正在使用ASP.NET Core 2.1.
我想覆盖默认的用户创建相关验证机制。
目前我无法使用相同的UserName.
我的ApplicationUser模型有一个名为TenantID.
我想要实现的目标:UserName&EmailAddress必须是每个租户唯一的。
我一直在谷歌上搜索一个解决方案,但没有找到太多asp.net core关于这个的信息。
大多数结果只会涵盖Entity Framework方面,就好像它只是一个覆盖 OnModelCreating(...)方法的问题。有些与 ASP.NET Identity 的非核心版本有关。
我想知道我是否应该继续调查OnModelCreating方法?
或者,还有其他需要覆盖的东西Identity?
我正在尝试实现自定义确认对话框功能,该功能计划在应用程序范围内可用 - 跨所有组件。
为此,我使用Angular Material.
模态是一个单独的组件,我通过以下方式在另一个组件中解析它:
const dialogRef = this.confirmDialog.open(ConfirmDialogComponent, ... });
Run Code Online (Sandbox Code Playgroud)
我面临的问题 -使用这种方法我必须在每个组件中复制代码。DRY principle被侵犯。
更多细节:
...
export class SearchComponent extends AppComponentBase {...
constructor(public confirmDialog: MatDialog, ...) { super(injector); }
confirm(title: string, message: string) {
var promise = new Promise((resolve, reject) => {
const dialogRef = this.confirmDialog.open(ConfirmDialogComponent, {
width: '250px',
data: { title: title, message: message }
});
dialogRef.afterClosed().subscribe(result => {
if (result) {
resolve();
} else {
reject();
}
});
}); …Run Code Online (Sandbox Code Playgroud) singleton refactoring angular-services angular-material angular
I've seen occurrences when we import a package in the following way
import { SharedModule } from '@shared/shared.module';Run Code Online (Sandbox Code Playgroud)
@shared in this case refers to the folder located in our project
/src/shared
I am looking to avoid importing my class in a classic way using dots and slashes at the beginning (relative path approach), e.g.
import { SharedModule } from './shared/shared.module';
Does anyone know how to achieve this?
asp.net-core ×6
c# ×4
angular ×2
apache ×1
jwt ×1
linux ×1
multi-tenant ×1
nginx ×1
npm ×1
path ×1
postgresql ×1
refactoring ×1
singleton ×1
token ×1
typescript ×1
ubuntu ×1