小编Nic*_*las的帖子

在React前端中使用oidc-client.js和Identityserver4进行身份验证

最近我尝试使用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)

authentication reactjs identityserver4

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

授权策略总是返回 403 (Forbidden) - MVC/API

我创建了一个 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)

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

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

使用自定义函数.NET Core 2覆盖OnTokenValidated JwtBearerEvents

在我的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)

jwt bearer-token asp.net-core

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

在 Office-ui-Fabric 中的 DetailsLists 组件的同一行添加 EDIT 按钮 - ReactJS

我对 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)

ecmascript-6 reactjs office-ui-fabric

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

分别托管API和IdentityServer4托管(C#、. NET CORE)有什么优势?

也许我要问的问题非常明显和简单,但是作为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都是单独的项目,将两者作为单独的项目进行托管有什么好处。

c# api visual-studio asp.net-core identityserver4

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

带有 WPF Core 的 Entity Framework Core - 无法添加迁移

最近,我将 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)

c# wpf entity-framework wpf-core-3.0

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

Session.Timeout 在 ASP Classic/IIS 中无法正常工作

最近我创建了一个 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 Interval0

在此处输入图片说明

接下来,我也改变了Time-Out24 hoursSession PropertiesServices我的网站标签(下Sites):

在此处输入图片说明

然而这一切都没有任何影响。它仍然会在 20 分钟后结束会话(至少它会重置我的会话(“用户”)状态。

在插入网页的小时内,会话正在检查如下: …

iis session session-timeout asp-classic

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

Blazor Web assembly - 处理视口/设备宽度更改

最近,我在 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)

css blazor

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

是否可以INNER JOIN 2 id的不同类型/值?

正如标题所说,我正在尝试使用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类型.

我以为我可以解决它:

  1. 在查询中执行LIKE语句,其中表B(1001整数)的ID部分匹配表A的RelationID(D0001001字符串).然而,这不起作用

  2. 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 | 主题| 说明| …

sql sql-server join inner-join

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

C# SOAP 调用不断返回 500 错误

在做了一些调查并阅读了几篇有关它的文章之后,特别是这篇文章:

我想出了以下代码:

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# soap web-services

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