最近我尝试使用IdentityServer4和React客户端设置身份验证.我按照Adding a JavaScript clientIdentityServer文档的教程(部分)进行了操作:https://media.readthedocs.org/pdf/identityserver4/release/identityserver4.pdf也使用了该Quickstart7_JavaScriptClient文件.
缺点是我使用React作为我的前端,而我对React的了解并不足以实现使用React的教程中使用的相同功能.
尽管如此,我开始阅读并试图开始使用它.我的IdentityServer项目和API已设置好,并且似乎正常工作(也与其他客户端一起测试).
我首先将oidc-client.js添加到我的Visual Code项目中.接下来,我创建了一个在开始时呈现的页面(将其命名为Authentication.js),这是包含Login,Call API和Logout按钮的位置.此页面(Authentication.js)如下所示:
import React, { Component } from 'react';
import {login, logout, api, log} from '../../testoidc'
import {Route, Link} from 'react-router';
export default class Authentication extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<div>
<button id="login" onClick={() => {login()}}>Login</button>
<button id="api" onClick={() => {api()}}>Call API</button>
<button id="logout" onClick={() => {logout()}}>Logout</button>
<pre id="results"></pre>
</div>
<div>
<Route exact path="/callback" render={() => {window.location.href="callback.html"}} /> …Run Code Online (Sandbox Code Playgroud) 我创建了一个 API(带有 EF Core 的 .Net Core 2),带有一个端点来检索某些角色。我将 ASPNetIdentity 集成到我的项目中,并且我正在使用 AspNetRoles 和 AspNetRoleClaims。
在调用 API 时,用户在我的情况下具有特定的角色(管理员)。这个角色有几个角色声明。在 startup.cs 我为这个角色添加了策略:
options.AddPolicy(
"Create Roles", policy => policy.RequireClaim("Can create roles", "role.create"));
options.AddPolicy(
"View Roles", policy => policy.RequireClaim("Can read roles", "role.read"));
options.AddPolicy(
"Edit Roles", policy => policy.RequireClaim("Can update roles", "role.update"));
options.AddPolicy(
"Delete Roles", policy => policy.RequireClaim("Can delete roles", "role.delete"));
Run Code Online (Sandbox Code Playgroud)
在我的前端,用户可以使用他们的 Microsoft (azure) 帐户登录,并且他们的 oidc 声明 (ID) 与 AspNetUser 表中的 ID 匹配,如果在用户表中找不到他们的 oidc,则会自动添加他们(他们的 oidc id 为aspnetuser id),他们得到一个默认角色。
然而,在调用 Role 端点时,它总是返回 403 错误(禁止)。当我检查表时,用户具有访问端点的正确角色和角色声明。它怎么可能不断返回403?
端点如下所示:
[HttpGet]
[Authorize(Policy = …Run Code Online (Sandbox Code Playgroud) 在我的API项目中,我使用JwtBearer处理身份验证(用户使用Azure登录).调用API时,使用定义的Azure实例验证令牌,这一切都正常.
成功验证令牌后,已使用适当的角色将已登录的用户插入到我们自己的数据库中.现在处理的方式如下:
// Add authentication (Azure AD)
services
.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
sharedOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Audience = this.Configuration["AzureAd:ClientId"];
options.Authority = $"{this.Configuration["AzureAd:Instance"]}{this.Configuration["AzureAd:TenantId"]}";
options.Events = new JwtBearerEvents()
{
OnTokenValidated = context =>
{
// Check if the user has an OID claim
if (!context.Principal.HasClaim(c => c.Type == "http://schemas.microsoft.com/identity/claims/objectidentifier"))
{
context.Fail($"The claim 'oid' is not present in the token.");
}
ClaimsPrincipal userPrincipal = context.Principal;
// Check is user exists, if not then insert the …Run Code Online (Sandbox Code Playgroud) 我对 Office ui Fabric-React 和 React 非常陌生,所以如果我做得完全错误,请毫不犹豫地给我指点。
尽管我的要求相当简单,但我就是无法弄清楚。
我有一个带有列表视图的页面(office-ui-fabric-reactjs的DetailsList组件),这个DetailsList从工作正常的API端点获取它的项目:
componentDidMount() {
_items = []
// Get list of Mediums, then push it to the _items array
axiosTRS.get('/media').then(response => {
response.data.map(item => {
_items.push({ id: item.mediumID, name: item.name, imo: item.imo })
})
this.setState({ items: _items })
})
}
Run Code Online (Sandbox Code Playgroud)
详细信息列表正在完美填写。但是,现在我想向每一行添加一个“编辑”按钮,因此这不是单独的列。
我想我应该在onRenderRow渲染 DetailLists 的属性上执行此操作:
render() {
return (
<div>
<Panel panelHeaderName={'Medium Overview'}>
<div>
<MarqueeSelection selection={this.selection} >
<DetailsList
onRenderRow={this.onRenderRows}
onRenderDetailsHeader={this.onRenderColumn}
selection={this.selection}
selectionMode={this.state.selectionMode}
onColumnHeaderClick={this.sorting}
onColumnResize={this.columnResizer}
layoutMode={DetailsListLayoutMode.justified}
className='customPanel'
columns={this.state.columns}
items={this.state.items}
// onRenderItemColumn={ this._onRenderColumn } …Run Code Online (Sandbox Code Playgroud) 也许我要问的问题非常明显和简单,但是作为IdentityServer4的初学者,或者总体上或多或少的oAuth2,OpenID和API的初学者,我觉得很难理解。
我们公司的目标是使用身份验证和授权转向更安全的应用程序构建方式(Visual Studio 2017,C#、. NET Core 2)。经过几天的研究,我最终使用了IdentityServer4(也是因为文档确实很棒)。
遵循IdentityServer文档(https://media.readthedocs.org/pdf/identityserver4/release/identityserver4.pdf)直到第7章,我还剩下一本。
我正在尝试使用API后端构建MVC应用程序(网络)以检索/插入数据,以便以后可以将API用于SPA / Xamarin应用程序等其他应用程序。对于IdentityServer主机,我选择了具有asp.net身份的IdentityServer。我运行了它,一切都很好,但是仍然存在以下问题:
托管我想与IdentityServer主机一起处理数据库操作的API的缺点是什么?对我来说,有这么多不同的项目似乎不合逻辑,而(据我所知)这两个项目(API和IdentityServer主机)可以完美地结合在一起。
在(几乎)IdentityServer4的所有示例中,IdentityServer主机和API都是单独的项目,将两者作为单独的项目进行托管有什么好处。
最近,我将 WPF 应用程序 (.NET 4.7) 迁移到 .Net Core 3.1。除了我无法生成/添加 EF Core 迁移之外,大部分工作正常。
我dbContext在以下帖子的帮助下使用依赖注入集成了我的 / EF Core:
数据库已连接并且工作正常。但是,当我尝试通过输入以下命令来添加迁移时:Add-Migration InitialMigration我不断收到以下错误:
无法创建“MyDBContext”类型的对象。有关设计时支持的不同模式,请参阅https://go.microsoft.com/fwlink/?linkid=851728
在 Web 应用程序中,这似乎是一个常见/已知的问题,可以通过在程序类中更改CreateHostBuilder为来修复;BuildWebHost/sf/ask/4042183701/
我还通过添加找到了一些其他MigrationsAssembly帖子options.UseSqlServer。
长话短说,我尝试了所有这些解决方案,但似乎都不起作用。可能是因为我的应用程序不是 Web 应用程序(没有程序类,例如 BuildWebHost),而是 WPF(核心)应用程序。
我的 WPF 应用程序初始化代码如下所示:
应用程序.xaml.cs
public partial class App : Application
{
private readonly IHost host;
public IServiceProvider ServiceProvider { get; private set; }
public IConfiguration Configuration { get; private set; }
public App()
{
host = Host.CreateDefaultBuilder() …Run Code Online (Sandbox Code Playgroud) 最近我创建了一个 asp 经典网页,用户可以用它插入他的工作时间。
其中一个请求是该页面应显示每 10 分钟登录一次的消息。用户在一台机器上进行生产,并且在他旁边有一台计算机,因此用户可能会在小时网页上处于非活动状态 5-60 分钟(甚至更长时间),但他仍然会停留在该页面上。
为了每 10 分钟弹出一次消息,我使用了在 JQuery 中创建的计时器,这一切正常。由于总非活动时间不确定,此人希望会话超时时间较长(24 小时),以便会话状态(登录者)保持很长时间。当用户使用插入小时网页时,他被要求在不同的网页上选择他的用户名,然后设置会话(“用户”)。
为了完成长时间的会话超时,我global.asa在根目录中创建了一个文件,代码如下:
<script language="VBScript" runat="Server">
<!-- METADATA
TYPE="typelib"
UUID="00000200-0000-0010-8000-00AA006D2EA4"
-->
Sub Session_OnStart
' Session timeout in minutes (24 hours)
Session.Timeout = 1420
End Sub
</SCRIPT>
Run Code Online (Sandbox Code Playgroud)
虽然出于某种原因(我计时)超时仍然是默认的 20 分钟..然后我也尝试设置Session.Timeout = 1420:
一种。小时的网页插入和
湾 在选择用户和设置会话的页面中。
不过这没有任何影响。于是我开始研究它并在stackoverflow上发现了一个类似的问题:Classic ASP网站中的会话超时
所以这让我看看我IIS在服务器上的设置,我在那里更改了一些东西。
在网站的应用程序池中,我将其更改Regular Time Interval为0:
接下来,我也改变了Time-Out对24 hours在Session Properties上Services我的网站标签(下Sites):
然而这一切都没有任何影响。它仍然会在 20 分钟后结束会话(至少它会重置我的会话(“用户”)状态。
在插入网页的小时内,会话正在检查如下: …
最近,我在 Blazor WebAssembly 项目中创建了一个自定义导航菜单(使用 TailwindCSS)。根据设备宽度,显示/隐藏侧边栏(使用 Tailwind 隐藏和带有 CSS 类的设备)。
在特定的设备宽度上,显示菜单按钮,特定于移动侧边栏的 div 始终隐藏(显示:无),在 Blazor 中,我创建了一个函数,将@onclick移动侧边栏的样式设置为空(所以显示:没有被删除),反之亦然。
这一切都很完美,但是这种方法有一个问题。单击菜单按钮时,将显示移动侧边栏,如果我现在增加设备宽度,则菜单按钮将自动隐藏,移动侧边栏也是如此,如果我再次减小设备宽度,菜单按钮将自动隐藏再次显示,但“打开”侧边栏 div 也被显示(因为在最后一个较小的设备宽度中也被打开(显示样式:无被删除)。
行为应该是,当设备宽度增加时,移动侧栏应始终保留其样式属性 display:none。
不过,据我所知,Blazor 中没有任何事件会触发changed device width? 有什么方法可以让它工作吗?
下面的一些图像和 HTML 代码显示了“问题”:
手机查看:
所以问题是,当我从Mobile sidebar opened viewback 到Normal size view然后回到时Mobile view,它会显示Mobile sidebar opened view相反 (因为它仍然有一个空的样式属性,相当于display: block)
HTML / Blazor C# 代码:
<div class="md:hidden" style=@mobileSideBarDisplay> <!-- Blazor C# string that sets the display to display: none, or removes the display …Run Code Online (Sandbox Code Playgroud) 正如标题所说,我正在尝试使用INNER JOIN具有不同值/数据类型的列.
在一个数据库表中,我们称之为表AI我想做一个select语句来获取几列(Subject,Name,Description,Date)的值.虽然我也想要一个关系名称.但问题是关系名称(在关系表中设置,表B)在表A中显示为字符串值(D0001001) - 因此不是文字名称.
为了获得文字关系名称,存在与表B的链接,其具有ID列1001-1000~和关系'文字'名称列.因此,例如在表B中,ID 1001匹配公司名称MC DONALDS,在表A中,RelationID是D0001001(MC DONALDS).
不要问我为什么表A中的RelationID与它前面的奇怪D000有关,我不知道,但它有一些功能.
所以回到问题所在.我想从表A中获取一些字段,但也要从表B中获取文字关系名称,它与表A的relationID值匹配.
所以问题是,我如何才能INNER JOIN对这两种不同的值/类型进行研究?RelationID在表A中是字符串类型(nvarchar确切地说),在表B中ID,匹配关系名称是一种Integer类型.
我以为我可以解决它:
在查询中执行LIKE语句,其中表B(1001整数)的ID部分匹配表A的RelationID(D0001001字符串).然而,这不起作用
REPLACE通过替换RelationID'D000'值来做一个声明:"".对于表A值,这可能仍然需要某种类型的强制转换为整数.这里有一些错误可能是因为语法错误.
到目前为止我所拥有的:
SELECT
TableA.subject, TableA.Name, TableA.Description, TableA.Date,
TableB.RelationName
INNER JOIN
TableB ON TableA.RelationID = TableB.ID
Run Code Online (Sandbox Code Playgroud)
这返回了一个不可能的转换(字符串/整数).
那么我试过:
SELECT
TableA.subject, TableA.Name, TableA.Description, TableA.Date,
TableB.RelationName
INNER JOIN
TableB ON TableB.ID LIKE '% TableA.RelationID %'
Run Code Online (Sandbox Code Playgroud)
这也不起作用(EOF).
为了让我的表格更清晰:
表A + ------------ + ----------- + ------------------ + --- ------------------ + ----------- + | RelationID | 主题| 说明| …
在做了一些调查并阅读了几篇有关它的文章之后,特别是这篇文章:
我想出了以下代码:
RequestingXMLData = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:urn=""urn:iaso-com:cloud:mansvc:15.12.0"">
<soapenv:Header/>
<soapenv:Body>
<urn:Authenticate>
<request>
<partnerName>XXX</partnerName>
<userName>XXX</userName>
<password>XXX</password>
</request>
</urn:Authenticate>
</soapenv:Body>
</soapenv:Envelope>";
//Retrieves XML Data from API link / service, optional to spit XML to a given file location
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ApiCallPath);
request.Method = "POST";
request.ContentType = "text/xml;charset=\"utf-8\"";
request.ContentLength = RequestingXMLData.Length;
using (Stream webStream = request.GetRequestStream())
using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
{
requestWriter.Write(RequestingXMLData);
}
try
{
WebResponse webResponse = request.GetResponse();
using (Stream webStream …Run Code Online (Sandbox Code Playgroud) c# ×4
asp.net-core ×3
jwt ×2
reactjs ×2
api ×1
asp-classic ×1
azure ×1
bearer-token ×1
blazor ×1
css ×1
ecmascript-6 ×1
iis ×1
inner-join ×1
join ×1
session ×1
soap ×1
sql ×1
sql-server ×1
web-services ×1
wpf ×1
wpf-core-3.0 ×1