ASP.NET 核心 blazor webassembly 为 Identity Server 4 Postman 测试获取令牌

Posted

技术标签:

【中文标题】ASP.NET 核心 blazor webassembly 为 Identity Server 4 Postman 测试获取令牌【英文标题】:ASP.NET core blazor webassembly getting token for Identity Server 4 Postman testing 【发布时间】:2021-09-10 08:11:12 【问题描述】:

我正在尝试在具有身份服务器 4 个个人帐户的 blazor webassembly asp.net 核心托管应用程序中使用邮递员测试我的 api。不幸的是,尽管尝试了许多不同的配置选项来获取新令牌,但我一直无法获得。这是我尝试过的

这会导致邮递员浏览器模拟器弹出并且永远不会完成。

这个失败了,但我得到了比info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Authorization failed. These requirements were not met: DenyAnonymousAuthorizationRequirement: Requires an authenticated user.更多信息的错误

但是,当我尝试使用默认的测试用户名和密码时,我得到Error: unauthorized_client

我在this article 中使用API authorization options 而不是配置文件服务选项逐步按照设置进行操作(并且我正在本地开发,而不是使用azure。)我需要做什么才能获得令牌?感谢您的帮助,谢谢。

编辑:尝试在 ConfigureServices 中添加一个新客户端,但同样的行为发生在邮递员浏览器模拟器弹出并且永远不会完成。

services.AddIdentityServer()
                .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options => 
                    options.IdentityResources["openid"].UserClaims.Add("name");
                    options.ApiResources.Single().UserClaims.Add("name");
                    options.IdentityResources["openid"].UserClaims.Add("role");
                    options.ApiResources.Single().UserClaims.Add("role");
                    options.Clients.Add(new IdentityServer4.Models.Client()
                    
                        ClientId = "postman",

                        AllowedGrantTypes = GrantTypes.Code,
                        AllowOfflineAccess = true,
                        ClientSecrets =  new Secret("secret".Sha256()) ,

                        RedirectUris =  "http://localhost:21402/signin-oidc", "https://oauth.pstmn.io/v1/browser-callback" ,
                        PostLogoutRedirectUris =  "http://localhost:21402/" ,
                        FrontChannelLogoutUri = "http://localhost:21402/signout-oidc",

                        AllowedScopes =
                        
                            IdentityServerConstants.StandardScopes.OpenId,
                            IdentityServerConstants.StandardScopes.Profile,
                            IdentityServerConstants.StandardScopes.Email,

                            "Onero.ServerAPI"
                        ,
                    );
                );

【问题讨论】:

尝试使用https://oauth.pstmn.io/v1/browser-callback 作为回调 URL。您可能需要将此添加到 IdentityServer 中允许的重定向 URL 您收到unauthorized_client 错误的原因是客户端无权使用密码凭据授予。即使您允许,您也必须实现 IResourceOwnerPasswordValidator 来验证用户凭据 【参考方案1】:

如果您使用授权码授予,请将此 URL 用作回调 URL,并保持 Authorize using browser 未选中。您还需要将 URL 添加到您的应用的 RedirectUris 列表中。

https://oauth.pstmn.io/v1/browser-callback

此页面只是向身份验证弹出窗口的父级(即邮递员窗口)发布一条消息

<script>
    let data = 
        isAuthCallback: true,
        queryString: window.location.search || '',
        hash: window.location.hash || ''
    ;

    window.opener.postMessage(data, '*');
</script>

如果您不想允许此 URL(您可能希望保护令牌免受第 3 方的影响),您可以在您的应用中托管此页面。

[HttpGet("postman-callback")]
public IActionResult PostmanCallback()

    return new ContentResult 
        ContentType = "text/html",
        StatusCode = 200,
        Content = @"
<html><body><script>
let data = 
    isAuthCallback: true,
    queryString: window.location.search || '',
    hash: window.location.hash || ''
;

window.opener.postMessage(data, '*');
</script></body></html>"
    ;

【讨论】:

你在说哪个RedirectUris?如果您的意思是我的 appsettings.json,那么我还没有定义任何内容。我尝试将RedirectUri 属性添加到IdentityServer,但这会导致错误。然后我尝试将该令牌创建端点添加到我的控制器并使用邮递员调用它,但结果是 401。我已经用我当前的 appsettings.json 更新了我的原始问题。 我能找到的关于 RedirectUris 的所有信息都是 Azure 相关信息,就像我提到的,这个应用程序当前没有部署。只是在本地运行 见:docs.identityserver.io/en/latest/topics/…。 RedirectUris = "http://localhost:21402/signin-oidc" 我更新了我的原始评论,其中我尝试通过在我的 ConfigureServices 方法中添加一个新客户端来尝试此操作,就像提到的文档一样,但我得到了相同的行为。【参考方案2】:

在阅读了几天的文档和博客以了解整体情况后,我终于能够做到了!我所做的如下:

仔细查看了启动我的服务器项目的输出,这是我看到的:

这让我意识到我在 Postman 中为 Auth URL 使用了错误的端点。所以我把它改成了https://localhost:5001/connect/authorize。然后我在 Postman 中使用了这个配置

结合在服务器的 Startup.cs 文件中添加 Postman 客户端

 services.AddIdentityServer()
                .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options => 
                    ...
                    options.Clients.Add(new IdentityServer4.Models.Client()
                    
                        ClientId = "Postman",

                        AllowedGrantTypes = GrantTypes.Code,
                        AllowOfflineAccess = true,
                        ClientSecrets =  new Secret("secret".Sha256()) ,

                        RedirectUris =  "http://localhost:21402/signin-oidc", "https://oauth.pstmn.io/v1/browser-callback" ,
                        PostLogoutRedirectUris =  "http://localhost:21402/" ,
                        FrontChannelLogoutUri = "http://localhost:21402/signout-oidc",
                        AllowedScopes =
                        
                            "Onero.ServerAPI"
                        ,
                    );;
                );

终于弹出了那个小邮递员页面,带我到默认的 IdentityServer AuthUI 页面,使用我的默认用户登录,然后我们就开始了,终于得到了该死的令牌。

最大的收获:确保读取服务器输出以确保您的端点正确,以便您可以正确填写 Postman 中的参数。

感谢您的帮助!

【讨论】:

以上是关于ASP.NET 核心 blazor webassembly 为 Identity Server 4 Postman 测试获取令牌的主要内容,如果未能解决你的问题,请参考以下文章

Asp.NET Core进阶 第四篇 Asp.Net Core Blazor框架

在 ASP.NET Core 站点中实现 Blazor - 组件不在视图中呈现

Blazor - WebAssembly ASP.NET Core 托管模型

从 ASP.NET Core Blazor 中的 .NET 方法调用 JavaScript 函数

从模板 Visual Studio 创建 Blazor(ASP.NET Core 托管)项目

Angular、Vue、React、Web Components、Blazor、Javascript、jQuery和ASP.NET Framework,