小编Ale*_*man的帖子

JWT身份验证 - UserManager.GetUserAsync返回null

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)

usernull.

也许,我忘了添加一些额外的索赔?

或者,也许,一旦我使用JWT - 我应该覆盖默认UserManager功能,以便它获取用户claim保持UserID

或者可能有更好的方法?


附加信息:

Identity注册如下

services.AddIdentity<ApplicationUser, ApplicationRole>()
    .AddEntityFrameworkStores<AppDbContext>()
    .AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)

ApplicationUser.Id字段是bigint(或在C#中 …

c# claims-based-identity asp.net-identity asp.net-core

11
推荐指数
1
解决办法
3943
查看次数

启动时在Linux下运行ASP.NET Core应用

我想在Linux下运行ASP.NET Core解决方案,使其在启动时运行。

从Microsoft 文档来看,有两种方法:ApacheNginx

两种方法都涉及代理通行证,例如

阿帕奇:

<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启动时自动启动应用程序

linux apache ubuntu nginx asp.net-core

8
推荐指数
1
解决办法
4144
查看次数

如何在服务层获取用户

我使用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 …

c# asp.net-core asp.net-core-middleware

7
推荐指数
1
解决办法
1572
查看次数

ASP.NET Core和JWT令牌生存期

我利用 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, ...)但这没有太大作用.

c# authentication token jwt asp.net-core

6
推荐指数
1
解决办法
9307
查看次数

实体框架和 PostgreSQL:引号问题

我面临的问题是 pgAdmin 4 中的 SQL 查询。

实体框架(包括其核心版本)将表和列的名称大写。

这意味着你的 SQL 将类似于

select e."Id", e."Text" from "Entries" e
where e."Text" like '%implicated%'
Run Code Online (Sandbox Code Playgroud)

我在谷歌上搜索防止实体框架大写名称的方法,但没有找到太多信息。

是否有解决方法可以避免将表名和列名用引号引起来?

提前致谢!

postgresql entity-framework entity-framework-core

5
推荐指数
2
解决办法
6201
查看次数

使用多个参数注册 DbContext

我正在尝试将 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)

但我不明白如何正确注册它 - 如果我将断点放在构造函数中 -tenantProvidernull

该位来自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

5
推荐指数
1
解决办法
7944
查看次数

每个租户的唯一用户名和电子邮件

我正在使用ASP.NET Core 2.1.

我想覆盖默认的用户创建相关验证机制。

目前我无法使用相同的UserName.

我的ApplicationUser模型有一个名为TenantID.

我想要实现的目标:UserName&EmailAddress必须是每个租户唯一的。

我一直在谷歌上搜索一个解决方案,但没有找到太多asp.net core关于这个的信息。

大多数结果只会涵盖Entity Framework方面,就好像它只是一个覆盖 OnModelCreating(...)方法的问题。有些与 ASP.NET Identity 的非核心版本有关。

我想知道我是否应该继续调查OnModelCreating方法?

或者,还有其他需要覆盖的东西Identity

c# multi-tenant asp.net-core asp.net-core-identity

5
推荐指数
1
解决办法
1720
查看次数

angular - 在所有组件中共享模态

我正在尝试实现自定义确认对话框功能,该功能计划在应用程序范围内可用 - 跨所有组件。

为此,我使用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

3
推荐指数
1
解决办法
2281
查看次数

typescript - importing custom class using "@" sign

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?

path npm typescript angular

1
推荐指数
1
解决办法
480
查看次数