小编Luk*_*988的帖子

.NET Core WebAPI 依赖注入解析 null

我将 .NET Core WebAPI 与依赖项注入和多个身份验证模式(http 基本、访问密钥、JWT)结合使用。我注入了一些需要一些经过身份验证的用户数据的业务服务。如果用户通过任何 auth 中间件进行身份验证,DI 工作正常。如果用户未通过身份验证,DI 将无法解析某些服务。我需要 DI 返回null

这怎么可能?下面的代码将导致异常,null不允许作为结果。

services.AddTransient<IMasterRepository>(serviceProvider =>
        {
            var _serviceFactory = new RepositoriesFactory(Configuration);

            if (!Authenticated)
            {
                return null;
            }

            return _serviceFactory.CreateMasterRepository();
        });
Run Code Online (Sandbox Code Playgroud)

另外,我无法在身份验证中间件中返回 401,因为另一个中间件可能会成功(expl:无法在 http 基本身份验证中间件中返回 401,因为下一个 JWT 可能会成功)

此外,我无法在所有身份验证中间件之后添加“需要身份验证”检查,因为某些控制器是公共的(不需要身份验证/依赖项注入)。

有什么建议吗?谢谢!

c# authentication dependency-injection asp.net-web-api .net-core

10
推荐指数
2
解决办法
4314
查看次数

雨果改变布局

我的 Hugo & Doks 项目有以下结构:

 - content 
   - docs
      - working.md
      - working-as-well.md
   - get-started2
      - working.md
      ...
   - get-started.md
...
  - layouts
    - get-started2
      - single.html
    - get-started.html
Run Code Online (Sandbox Code Playgroud)

内容放置在docsget-started2定义布局中并按预期工作。伟大的!

然而,我为get-started.md. 我不能像get-started2- 将它放入文件夹中那样做。客户端请求的开始 URL 为:

www.SomeProject.com/get-started

所以它不能放在文件夹中(如get-started2

www.SomeProject.com/get-started2/working

请问您有什么提示吗?

hugo

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

Angular6 在没有路由的情况下更新查询参数

我正在处理的这个项目有很多带有搜索、排序和分页功能的列表。我完全能够使用这些条件(搜索、排序、分页)从 API 获取数据。

但是,我被要求制作一个“可共享链接”,以便用户可以在两者之间共享他们的查询列表。如果用户 A 将其列表按“客户”排序,并在第 5 页上将链接发送给用户 B,则他或她将打开第 5 页上按“客户”排序的相同列表。简单的。

我有一个可行的解决方案。我订阅了 ActiveRoute 上的 queryParams,解析这些参数,然后重新加载列表。请参阅下面的代码。

组件模板html:

<ngb-pagination [collectionSize]="size" [page]="page" (pageChange)="changePage" >
</ngb-pagination>
<pre>Current page: {{page}}</pre>
Run Code Online (Sandbox Code Playgroud)

组件打字稿:

ngOnInit() {

    this.route
      .queryParams
      .subscribe(queryParams => {

          this.sort = queryParams['sort'];
          this.search = queryParams['search'];
          this.page= +queryParams['page'] || 1;

          this.refresh();
    });

    this.refresh();
}

refresh() : void {

    this.transactionsService.fetch({
      from: (this.page - 1) * this.size,
      take: this.size,
      search: this.search,
      sort: this.sort
    }).subscribe(data => {

      this.entities = data.entities;

      this.total_size = data.total;
    });

}

changePage(event: number) : void { …
Run Code Online (Sandbox Code Playgroud)

typescript angular

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

Angular5-具有区域设置日期/数字格式的双向数据绑定

我正在尝试 使用数字或日期的语言环境格式对输入进行两种方式的数据绑定。参见下面的代码:

<input type="date" [ngModel]="user.date_created | date:'shortDate' " (ngModelChange)="user.date_created=$event" name="date_created"                                                 />
Run Code Online (Sandbox Code Playgroud)

app.module.ts还包括自定义语言环境('de')

import { registerLocaleData } from '@angular/common';
import locale_de from '@angular/common/locales/de';

registerLocaleData(locale_de);
Run Code Online (Sandbox Code Playgroud)

并包括在提供者中:

providers: [{
      provide: LOCALE_ID,
      useValue: 'de'
  }
],
Run Code Online (Sandbox Code Playgroud)

我能做的是在输入中获得漂亮的日期格式。用户看到了[20. 12. 2017],这是非常好的。但是,如果用户将输入更改为其他日期(手动),则模型上的值将从ISO格式更改为语言环境字符串:

在输入元素发生更改之前,通过API建立模型:

user.date_created: '2017-12-20T12:03:00'
Run Code Online (Sandbox Code Playgroud)

输入元素更改后的模型:

user.date_created: '23. 12. 2017'
Run Code Online (Sandbox Code Playgroud)

date_created属性是.ts中模型上的dateof日期。基本上,我对小数也有同样的问题。

我尝试了Tomas Trajan的自定义格式化程序指令,该指令可以完全满足我的需求,但语言环境是硬编码的。

有什么建议的方法如何使用语言环境格式设置双向数据绑定,或者如何将当前语言环境注入Formatter指令?

感谢您的任何建议。

angular

6
推荐指数
0
解决办法
323
查看次数

ASP.NET Core WebAPI Cookie + JWT身份验证

我们有一个带有API后端(ASP.NET Core WebAPI)的SPA(角度):

SPA正在侦听app.mydomain.com,API 正在侦听app.mydomain.com/API

我们使用内置的JWT进行身份验证Microsoft.AspNetCore.Authentication.JwtBearer;我有一个app.mydomain.com/API/auth/jwt/login创建令牌的控制器。SPA将它们保存到本地存储中。所有作品都很完美。经过安全审核后,我们被告知要为cookie切换本地存储。

问题是app.mydomain.com/APISPA以及移动应用程序和一些客户的服务器2服务器解决方案都使用API on 。

因此,我们必须保持JWT不变,但要添加Cookies。我发现了几篇文章,它们结合了Cookie和JWT在不同的控制器上,但是我需要它们在每个控制器上并行工作。

如果客户端发送cookie,则通过cookie进行身份验证。如果客户端发送JWT承载,则通过JWT进行身份验证。

是否可以通过内置的ASP.NET身份验证或DIY中间件来实现?

谢谢!

c# authentication cookies jwt asp.net-core

6
推荐指数
5
解决办法
9163
查看次数

VS2017:多个asp.net核心项目调试

我们正在将我们的项目www.SampleProject.com从VS2013迁移到VS2017,同时考虑升级到ASP.NET Core.项目有以下结构:

  • 一些类库项目(BLL和DAL)
  • API(WebAPI2项目)
  • UI(使用NG 1.4的asp.net项目)

调试期间:

  • 主要启动项目是UI,从localhost:52000开始
  • 第二个启动项目是API,从localhost:52000/API /开始

这样的配置允许我们同时调试两个项目,这很方便.

此外,这种分离允许我们将API部署为单独的REST API服务(api.SampleProject.com),并在内部使用API​​用于UI(app.SampleProject.com/api)

在生产环境中,"内部API"在IIS中配置为UI项目中的嵌套应用程序.

但是,这不适用于ASP.NET Core和VS2017.

有没有任何已知的方法如何在同一端口上调试两个ASP.NET Core项目(如上所述)?

非常感谢

asp.net visual-studio-2017

5
推荐指数
0
解决办法
425
查看次数

Angular 5主/明细路由最佳实践

我只是在学习Angular 5,并且坚持使用Master / Detail的最佳实践。在Angular官方教程中的Master / Detail部分(此处:https : //angular.io/tutorial/toh-pt3)具有以下模式:

  • 主组件(包含英雄列表
    • 母版中使用的详细信息组件(这是选定英雄的详细信息

该示例在没有Route配置的情况下运行,因此在Hero选择过程中URL不变。整个逻辑在主组件内操作。

下一步,有一个“路由器”部分(此处:https : //angular.io/tutorial/toh-pt5

路由示例在同一级别的路由中同时使用列表组件和详细信息组件,并且两者都以其自己的逻辑分别操作。

我的问题1:

是否可以将这两个示例结合在一起使用任何Angular约定?我的目的是创建包含两个组件的HeroesContainer-Heroes List和Hero Detail。

  • 英雄容器组件
    • 英雄榜(其中包含列表英雄)
    • 英雄详细信息组件(是所选英雄的详细信息

然后将路由器设置为:

{
  path: 'heroes',
  component: HeroesContainerComponent,
}, {
  path: 'heroes/:id',
  component: HeroesContainerComponent,
}
Run Code Online (Sandbox Code Playgroud)

然后,如果没有路由ID,则会隐藏HeroDetailComponent。

如果路由任何ID,则HeroesListComponent将被隐藏。

我的问题2:

导航到相同组件时,Angular是否会保留组件的状态?用例:用户对列表进行排序和过滤,打开一些Hero(导航至详细信息),然后单击“ Back button”。我在AngularJS中使用了上述模式来实现这一目标。

感谢您的任何建议!

angular-routing angular

5
推荐指数
0
解决办法
5623
查看次数

ASP.NET Core AuthenticationHandler 依赖注入

这篇文章之后,我试图实现一个自定义AuthenticationHandler,但我陷入了依赖注入。

我需要将一个IRepository实例注入到 中AuthenticationHandler以提供 dbo 连接(以检查凭据)。

代码:

public class CustomAuthenticationHandler : AuthenticationHandler<CustomAuthenticationOptions>  
{
    // how to inject this?!
    private IRepository repository;

    public CustomAuthenticationHandler(IOptionsMonitor<CustomAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
        : base(options, logger, encoder, clock) {
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // this is just a sample
        if (repository.users.Count(w => w.user_name == Request.Headers["user_name"] && w.password == Request.Headers["password"]) == 1) 
        { 
            return Task.FromResult(
                AuthenticateResult.Success(
                    new AuthenticationTicket(
                        new ClaimsPrincipal(Options.Identity),
                        new AuthenticationProperties(),
                        this.Scheme.Name)));
        }

        return …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-core

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

AutoMapper 8.0 缺少 GetPropertyMaps

在 AutoMapper 8.0 之前,我使用此代码通过字符串查找属性映射,例如:实体模型具有名为“currency_id”的属性,而 DTO 具有名为“currency”的属性。我在 AutoMapper 中定义了双向映射,并使用此代码查找源/目标属性相关

    public static string GetDestinationPropertyFor<TSrc, TDst>(IMapper IMapper, string sourceProperty)
    {
        var mapper = AutoMapper.IMapper.ConfigurationProvider;

        // TSrc = source generic type
        // TDst = destination generic type
        var map = mapper.FindTypeMapFor<TSrc, TDst>();

        var propertyMap = map.GetPropertyMaps()
                              .FirstOrDefault(pm => 
                                    pm.SourceMember.Name == sourceProperty
                              );


        return propertyMap.DestinationProperty.Name;
    }
Run Code Online (Sandbox Code Playgroud)

在 AutoMapper 配置文件中:

        this.CreateMap<EntityModels.contact, DTO.contact>()
            .ForMember(m => m.currency, src => src.MapFrom(f => f.currency_id))
        ;

        this.CreateMap<DTO.contact, EntityModels.contact>()
            .ForMember(m => m.currency_id, src => src.MapFrom(f => f.currency))
        ;
Run Code Online (Sandbox Code Playgroud)

当我这样调用我的方法时:

var _dboField = …
Run Code Online (Sandbox Code Playgroud)

automapper .net-core

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

EF Core In-Memmory Array mapping

I have a string array column in database

ALTER TABLE sample ADD languages VARCHAR[] NULL;
Run Code Online (Sandbox Code Playgroud)

which is mapped to model:

public string[] languages { get; set; }
Run Code Online (Sandbox Code Playgroud)

Using EF Core with PostgreSQL (Npgsql.EntityFrameworkCore.PostgreSQL 2.2.0) works out of the box.

However, when I want to test DbContext using In-Memmory (Microsoft.EntityFrameworkCore.InMemory 2.2.4) I got this error:

System.InvalidOperationException: 无法映射属性“sample.languages”,因为它的类型“string[]”不是受支持的基本类型或有效的实体类型。显式映射此属性,或使用 '[NotMapped]' 属性或使用 'OnModelCreating' 中的 'EntityTypeBuilder.Ignore' 忽略它。

因此,将其添加到模型构建器配置中可以解决 In-Memory 错误:

 builder.Property(p => p.languages)
                    .HasConversion(
                        v => string.Join("'", v),
                        v => v.Split(',', StringSplitOptions.RemoveEmptyEntries));
Run Code Online (Sandbox Code Playgroud)

但引发了新的(Npgsql):

无法在 Npgsql.NpgsqlDefaultDataReader.GetFieldValue[T](Int32 …

entity-framework npgsql ef-core-2.2

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

ASP.NET Core JWT 身份验证更改声明(子)

我有一个使用 JWT 身份验证的 ASP.NET Core API。简单的设置:

....
string authority = $"https://{configuration["Auth:Authority"]}";
string audience = configuration["Auth:Audience"];

return builder.AddJwtBearer(options =>
{
    options.Authority = authority;
    options.Audience = audience;

    options.TokenValidationParameters = new TokenValidationParameters
    {
        // NameClaimType = "http://schemas.org/email"
        // NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/email"
        // NameClaimType = "sub"
    };
});
Run Code Online (Sandbox Code Playgroud)

(正如您所看到的注释代码,我一直在尝试几种设置)

当我解码 JWT(使用 jwt.io)时,我看到 JWT 中有声明“sub”并且有字符串值(dbo 中用户的内部 ID)

{
  "nbf": 1592585433,
  "exp": 1592585763,
  "iss": "https://*************",
  "aud": "api_10",
  "sub": "142",
  "scope": [
    "openid",
    "api_10"
  ]
}
Run Code Online (Sandbox Code Playgroud)

问题是 dotnet 将 sub 切换到名称声明。这不返回 (0) 结果:

principal.Claims.Where(w => w.Type == …

c# jwt asp.net-identity asp.net-core identityserver4

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

JavaScript 单参数或数组

我有一个 JavaScript 函数,它当前接受一个参数:

foo(country) { ... } 所以像这样使用 foo('US')

我需要扩展此功能以接受一个或多个国家/地区:

foo('US')
foo('US', 'CA', 'UK')
foo(['US', 'CA', 'UK'])
Run Code Online (Sandbox Code Playgroud)

是否有任何语法/关键字功能?在 C# 中,我们有一个params关键字

javascript

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

C#多维数组转化为数组

我有["x3;s4;r4", "x2;s6;r7", ...]包含某种“多维”数据的字符串数组。我遵循 LINQ:

var fieldsArrays = data.Select(s => s.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries));
Run Code Online (Sandbox Code Playgroud)

此查询返回真正的多维数组[["x3", "s4", "r4"], [...]] 我需要将所有值选择到一个一维数组中:["x3", "s4", "r4", "x2", "s6"]

请问这有什么 LINQ 魔法?

谢谢!

.net c# linq

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