我想知道如何"重新加载"当前状态,传入一个新参数,以便我的控制器重新初始化.
我试图在我的侧边栏控件中实现搜索 - 初始搜索使用$ state.go转换到我的新状态,如下所示:
if ($event.type === 'click' || $event.keyCode === keyCodes.enter) {
$state.go("people.search", { search: vm.searchText });
Run Code Online (Sandbox Code Playgroud)
如果我在应用程序中的另一个状态,并且上面的代码运行,一切正常.所以,我将搜索词作为参数传递,$ state.go将我的状态转换为people.search状态,我的人员控制器(包含搜索功能)被点击.但是一旦我在people.search状态并尝试使用搜索控件,人员控制器代码就不再受到攻击而且参数没有得到更新.
我尝试将代码修改为:
$state.go("people.search", { search: vm.searchText }, { location: "replace" });
Run Code Online (Sandbox Code Playgroud)
现在,当我处于当前状态时,这将使用我的新搜索词更新URL,但控制器代码未触发.
我需要一种方法来强制重新加载我当前所处的相同状态,以便更新新的搜索参数并重新运行人员控制器代码.
如何重新加载当前状态?
我正在使用ng-model-options来防止我的文本输入模型被更新,直到焦点丢失.那部分都有效.但是,我需要在文本输入失去焦点并更新模型后处理事件.在那种情况下,我需要访问新模型的更新值,而不是旧模型.
我试图使用ng-blur事件,但是,在我的处理程序中,值是旧值,而不是输入的新值.我做错了什么或者在文本输入失去焦点后是否有更好的方法来获取新提交的模型值?
<input type="text"
ng-model-options="{ updateOn: 'blur', debounce:0 }"
ng-model="vm.myModel.amount"
ng-blur="vm.handleBlurEvent(vm.myModel.amount)" />
vm.handleBlurEvent = function(item)
{
//alert(item.amount); //Old amount - not new amount entered
}
Run Code Online (Sandbox Code Playgroud) 我有一个.NET核心项目,我正在尝试使用AuthorizationOptions创建自定义策略,如下面的文档中所示:
这些示例显示了使用1个参数设置授权要求 - 一个简单的int值.我的自定义要求需要字符串参数以及DbContext对象.我想在运行时将DbContext注入需求的构造函数中.我正在使用Autofac容器.我不确定如何实现这一点 - 尝试了几种方法,到目前为止还没有任何工作.
这是我的自定义要求:
public UserNameRequirement(string username, MyDbContext context)
{
_userName = username;
_dbContext = context;
}
Run Code Online (Sandbox Code Playgroud)
在Startup.cs ConfigureServices方法中设置授权选项时,文档显示您如下所示注册:
services.AddAuthorization(options =>
{
options.AddPolicy(
"UserNamePolicy",
policy => policy.Requirements.Add(new UserNameRequirement("admin", ** want to resolve and inject my DbContext here **)));
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何实现这一目标.我看过这篇文章是一个类似的问题,但它使用的是ASP.NET 5,并且该语法不适用于.net核心:
dependency-injection autofac asp.net-authorization .net-core asp.net-core
我正在使用的应用程序是SPA,在与使用.NETCore和ASP.NET Identity的后端API通信时,我们正在使用JWT Bearer身份验证和OpenIdConnect / OAuth2。我们的API端点使用基于自定义策略的身份验证来保护,如下所示:
我们决定使用现成的AspNetRoleClaims表将用户的声明存储为权限。每个用户都被分配了1个主要角色,尽管潜在的角色是多个角色。每个角色将有许多声明-存储在AspNetRoleClaims表中。
角色声明如下所示:
ClaimType:权限
ClaimValue(s):
MyModule1.Create
MyModule1.Read
MyModule1。编辑
MyModule1.Delete
MyModule1.SomeOtherPermission
MyModule2.Read
MyModule3.Read
MyModule3。编辑
等等
用户拥有的权限或角色越多,access_token就会越大,从而增加HTTP标头的大小。还有ASP.NET身份授权cookie-随着越来越多的角色声称它被拆分为多个cookie。
我尝试添加很多角色声明,最终请求失败,因为标头变得太大。
我正在寻找有关使用角色声明进行承载身份验证的“最佳实践”的建议。Microsoft为您提供了适用于我的方案的开箱即用的AspNetRoleClaims,据我所知,将这些角色声明存储在access_token中的优点是我们不必在受自定义策略保护的每个API终结点上访问数据库。
从我的角度来看,我可以尝试使声明值变小,并且在用户具有多个角色且可能共享重复的常见角色声明的情况下,我可以尝试在将这些声明写入Cookie和删除重复项。
但是,由于该应用程序仍在开发中,因此可以预见会有越来越多的角色声明被添加,并且由于Cookie和access_token的存在,HTTP标头始终可能变得太大。不知道这是否是最好的方法。
我看到的唯一替代方法是,每次我们访问受保护的API时都访问数据库。我可以在每个自定义声明策略要求处理程序中注入DbContext,并在每个请求上与AspNetRoleClaims表进行对话。
我还没有看到太多有关人们如何使用ASP.NET Identity和.NET Core API实现更细粒度的权限方案的示例。我认为这必须是一个相当普遍的要求。
无论如何,只要针对这种情况寻找有关最佳实践建议的反馈和建议。
****更新-请参阅下面的答案****
我对证书和签名密钥之间的区别有些困惑,并有几个问题....
我已将 OpenIddict 配置为使用 JWT 承载身份验证。
1) AddDevelopmentSigningCertificate() 和 AddEphemeralSigningKey() 有什么区别?
当我使用其中一个时,我的应用程序可以工作。在开发过程中使用哪一个重要吗?
2) AddSigningCertificate() 和 AddSigningKey() 之间有什么区别,您何时使用其中之一或两者?
据我了解,签名证书用于对 JWT 令牌进行签名。但是当您使用 AddSigningKey 时 - 它也用于签署 JWT 令牌。如果您同时使用两者,这是否意味着 JWT 令牌会被签名两次 - 一个在另一个之上?还是一个覆盖另一个?
在我的场景中,我使用 AddDevelopmentCertificate() 或 AddEphemeralSigningKey() 进行开发,但对于生产,我知道我需要设置一个签名证书,理想情况下应该位于机器商店中。
但我还需要一个唯一的签名密钥,该密钥与使用 JWT 承载身份验证的 API 端点(在 .NET Framework 4.x 中)共享。
我想知道这些函数对 JWT 令牌做了什么以及它们如何相互配合。
最后一个问题:在设置 OpenIddict 表并使用客户端应用程序为数据库做种时,会填充一个客户端密钥。在示例项目中,这些始终是 GUID。
3) 使用 JWT Bearer 认证时是否使用了客户端密码?这与签名证书和签名密钥有何关系?
我真的很想了解这些东西是如何工作的,但在签名密钥/证书荒野中有点迷失了!
谢谢
我想知道从xUnit .net核心测试项目的配置文件中获取连接字符串的推荐方法。
我已使用适用于.net核心的新Visual Studio 2017 xUnit测试项目模板设置了一个测试项目。该项目将运行我的集成测试,该集成测试引用2个不同的.net核心类库项目-其中一个项目将使用EF Core与数据库通信。
我知道,通常不应在类库项目中设置或访问连接字符串-应该是消耗使用应设置连接字符串的类库的应用程序。
但是,在这种情况下,似乎xUnit测试项目被视为类库项目。我还没有看到任何有关如何设置某种配置文件并从测试项目访问该配置文件的示例。如何从配置文件访问连接字符串,以便测试项目可以使用Datalayer类库项目并传递适当的连接字符串?
我正在使用实体框架并有一个通用的存储库方法,它允许我查询 aDbSet并包括导航属性。我正在尝试为一些使用这段代码的代码编写单元测试,我需要模拟它进行单元测试。我正在使用最小起订量。
这是存储库方法 - 它是一种允许我使用表达式进行查询并包括我想要的相关导航属性的方法。我在 Pluralsight 的 Enterprise 课程中 Julie Lerman 的 EF 中看到了这种模式。
public IEnumerable<TEntity> FindByInclude(Expression<Func<TEntity, bool>> predicate,
params Expression<Func<TEntity, object>>[] includeProperties)
{
var query = GetAllIncluding(includeProperties);
IEnumerable<TEntity> results = query.Where(predicate).ToList();
return results;
}
private IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] includeProperties)
{
IQueryable<TEntity> queryable = DbSet.AsNoTracking();
return includeProperties.Aggregate
(queryable, (current, includeProperty) => current.Include(includeProperty));
}
Run Code Online (Sandbox Code Playgroud)
这是我如何在代码中使用此方法进行调用的示例(我只是展示了该方法的相关部分):
public ApiResult DeleteLocation(int id)
{
var location = _locationRepository
.FindByInclude(l => l.Id == id, l => l.LocationRegions, l => l.Pools)
.Single();
Run Code Online (Sandbox Code Playgroud)
因此,此查询将Location …
.net-core ×3
angularjs ×2
jwt ×2
asp.net-core ×1
autofac ×1
c# ×1
moq ×1
oauth-2.0 ×1
openiddict ×1
permissions ×1
xunit ×1