我有使用 X509Certificate2 创建 jwt 令牌的处理程序。对于单元测试,我需要提供证书,而我无法从本地商店获取证书。有没有办法,如何从文件中模拟、创建或加载证书?
到目前为止,我从这张票中尝试了 BouncingCastle 方法,但没有成功。ToX509Certificate2() 方法确实转换证书,但没有密钥。因此,如果这是好的方法,是否可以以某种方式生成这些密钥?
非常感谢提示
我MessageDialogues在我的应用程序的几个地方使用.问题是,只要有任何MessageDialog(或系统警报,如功能警告)处于活动状态而另一个人MessageDialog被调用,应用程序就会毫无例外地崩溃或者崩溃UnathorizedAccessException.
这就是我如何调用MessageDialog:
CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
MessageDialog msg2 = new MessageDialog(_resourceLoader.GetString("MsgGPSUnavailable"));
msg2.ShowAsync();
});
Run Code Online (Sandbox Code Playgroud)
我以为我应该等待对话框的关闭,但是通过使用Dispatcher我将这个对话框排队到主UI线程,它自己处理这个?感谢您对此问题的任何解释.
编辑 - 我一步一步地进行了下面的代码,它包含在同一个类中.当我运行app时,会调用LoadDataToModel.这没关系,msgGPSDisabled显示了对话框.之后引发事件并调用locator_StatusChanged.这也没问题,并显示对话框.现在奇怪的部分.当我不在LoadDataToModel中调用msgGPSDisabled且仅在locator_StatusChanged中调用msgGPSDisabled时,app会在显示对话框后立即崩溃.没有例外,第47行打开了App.gics(DEBUG &&!DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION).即使我使用try-catch,也可以使用它.当我在locator_StatusChanged中使用不带Dispatcher的msgGPSDisabled时,会引发异常.不可捕获,"找不到物品"
public async Task LoadDataToModel()
{
await msgGPSDisabled();
this.IsBusy = true;
await LoadDataGarvis(Stations); //rozparsuje raw data a na?te je do modelu
InitializePins();
this.IsBusy = false;
}
void locator_StatusChanged(Geolocator sender, StatusChangedEventArgs args)
{
switch (sender.LocationStatus)
{
case Windows.Devices.Geolocation.PositionStatus.Disabled:
try
{
CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
await msgGPSDisabled();
IsGPSBusy = false;
IsGPS = false;
}); …Run Code Online (Sandbox Code Playgroud) 我需要列出项目.我将用户集合绑定到列表框.一切都很好,但列表框中的项目不会实时更新.它们根本没有更新.因此,当我从列表中删除任何用户时,即使其源已正确更改,列表框也不会更新.
Source位于路径DataViewModel.Instance.AllUsers的数据视图模型中; 每当我向此列表添加新项目或删除一项时,布局都不会更新.其他绑定工作得很好.我试图更新列表框布局,提出源更新事件,添加/删除项目的其他方式,但没有任何工作.
我试图调试绑定,但我有太多的绑定来找到错误.
提前感谢任何有用的建议.
列表框:
<ListBox x:Name="ListboxUsers" ItemsSource="{Binding Path=AllUsers, Mode=OneWay}" Grid.Column="1" Margin="0" Grid.Row="5" Background="DimGray" BorderThickness="0" Visibility="Hidden" SelectionChanged="ListboxUsers_SelectionChanged"/>
Run Code Online (Sandbox Code Playgroud)
代码隐藏:
CatalogueGrid.DataContext = DataViewModel.Instance; //whole view model added as datacontext
Run Code Online (Sandbox Code Playgroud)
DataViewModel类:
public class DataViewModel : INotifyPropertyChanged
{
private static DataViewModel _dataViewModel;
private Collection<UserModel> allUsers;
public Collection<UserModel> AllUsers
{
get
{
return allUsers;
}
set
{
allUsers = value;
NotifyPropertyChanged("AllUsers");
}
}
private DataViewModel()
{
AllUsers = new Collection<UserModel>();
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
PropertyChangedEventHandler handler = PropertyChanged; …Run Code Online (Sandbox Code Playgroud) 我有这样创建的JwtToken:
X509Certificate2 cert = certificateStore.Certificate;
var now = DateTime.UtcNow;
var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor()
{
Subject = new ClaimsIdentity(new[]
{
new Claim(JwtClaimTypes.Subject, upn),
new Claim(REQUEST_TYPE_NAME, requestType),
new Claim(DOMAIN_NAME, domain),
}),
Lifetime = new Lifetime(now, now.AddMinutes(60)),
SigningCredentials = new X509SigningCredentials(cert),
TokenIssuerName = ISSUER
};
SecurityToken token = tokenHandler.CreateToken(tokenDescriptor);
Run Code Online (Sandbox Code Playgroud)
这是对的。创建令牌,并将其第一个声明命名为“ sub”,它是JwtTokenTypes.Subject的内容。我通过jwt web进行了检查。
问题是,我有这种解决索赔的方法:
if (string.IsNullOrWhiteSpace(token)) throw new MissingTokenException("Token should not be null.");
var tokenHandler = new JwtSecurityTokenHandler();
var securityToken = new X509SecurityToken(new X509Certificate2(new X509RawDataKeyIdentifierClause(certificateStore.Certificate).GetX509RawData()));
var …Run Code Online (Sandbox Code Playgroud)