【问题标题】:How to do Authentication & Authorization Azure AD App, using C# WEBAPI (token based) .netcore如何使用 C# WEB API(基于令牌).net 核心对 Azure AD 应用程序进行身份验证和授权
【发布时间】:2020-03-19 21:20:57
【问题描述】:

我能够为我的 .netcore MVC 应用+reactjs(计费应用)进行身份验证和授权 此应用程序将托管在 IIS 上,并在计划托管 .netcore Webapi 的同一台服务器上 (图表应用)。

通过使用Billing App,我们将调用图表WebApis。现在 WebApi 应该是 Authenticate/Authorize user based on token sent by front-end 应用程序(基于令牌的 webapi 执行 Auth/Autho,没有其他登录弹出窗口)

  1. 通过以下链接请求可以使用postman-see img 生成令牌

    https://login.microsoftonline.com/{{tenandId}}/oauth2/token

将带有标头的这个令牌发送到 Web-API,Web-API 将具有与计费应用相同的 Azure AD 应用配置(客户端 ID、范围等)。 Api 应该验证令牌并发送图表数据。

  1. 是否应该在 reactjs 中尝试 adal/msal 并使用 Authorize 属性装饰 WebApis 以便处理身份验证和授权?

有很多链接,但很少有代码不起作用,很少有进程不再适用于 Azure,很少有大型代码,而这并不是我想要的。

基本上,我将在 .netcore 中托管一个执行 Auth 部分的应用程序,现在 WebApi 也应该使用相同的用户 cookie/token 进行身份验证,因为我不想提供另一个登录弹出窗口,请参阅很多 MS 示例代码但没有运气

哪种方法是正确的 1 或 2,并分享示例代码/链接任何帮助表示赞赏,

【问题讨论】:

    标签: c# authentication azure-active-directory asp.net-core-webapi azure-ad-b2b


    【解决方案1】:

    据我了解,您有一个名为 Billing App 的客户端应用程序将登录用户并通过基于用户的访问令牌调用 API。 如果是这样,您应该注册两个应用程序,一个用于计费应用程序的客户端应用程序和一个服务端应用程序。对于客户端应用程序,因为这是一个客户端,您应该使用用户的凭据从 Azure AD 获取而不是应用程序客户端机密.要实现这一点,您应该将其配置为 Azure AD 上的公共客户端并启用访问令牌和 ID 令牌:

    由于您想获取服务端应用程序的调用 API,您应该授予以下权限以确保用户可以通过您的客户端应用程序获取访问令牌(假设“stanapitest”这里是服务端应用程序): 请注意,请点击Grant admin consent for Devchat 按钮完成权限授予流程。 完成此过程后,您可以通过密码流获取基于用户的访问令牌:

    OAuth2 grant code flow 或 Oauth2 隐式授权流程,当然取决于您的要求。

    好了,到了服务端,演示.net core Api,让我们在VS中创建一个简单的.net core Api项目:

    创建项目后,将客户端 ID 更改为您的服务应用 ID:

    运行项目并调用它的 API,您可以看到它已被 Azure AD 保护:

    使用基于用户的访问令牌来调用此 API:

    如您所见,它的工作原理是 excepted 。希望能帮助到你 。如果您有任何进一步的疑虑,请随时告诉我。

    【讨论】:

    • 感谢您提供如此详细的评论,问题是我不想提供另一个登录弹出窗口,因此发送用户 ID 和密码来获取令牌有点困难,因为用户已经输入计费应用程序中的凭据(使用 AAD 凭据登录)。还有其他方式吗?我可以验证从 .netcore WebApis 中的邮递员屏幕下方i.stack.imgur.com/IfqBi.png 获得的令牌吗?
    • 嗨@Azure-Core,如果用户已经拥有一个访问令牌,而资源是您的服务应用程序,则无需再次获取另一个令牌,您可以使用该令牌直接调用您的 API,我只是为了在这里演示一个孔的过程。如果您想验证令牌,这篇文章将对您有所帮助:stackoverflow.com/questions/39866513/…
    【解决方案2】:

    在计费应用程序中进行身份验证后,当您想要获取访问令牌以访问您的另一个 Web api 应用程序时,您可以使用 acquireTokenSilent 方法(msal.js)进行调用,该方法发出静默请求(无需通过 UI 提示用户) 到 Azure AD 以获取访问令牌。然后,Azure AD 服务会返回一个包含用户同意范围的访问令牌,以允许您的应用安全地调用 API。

    最好将你的 web api 设置为受 AAD 保护的独立资源,在你的前端 react 应用程序中,你可以使用acquireTokenSilent 获取用户登录后访问 web api 的令牌:

    // if the user is already logged in you can acquire a token
    if (msalInstance.getAccount()) {
        var tokenRequest = {
            scopes: ["user.read", "mail.send"]
        };
        msalInstance.acquireTokenSilent(tokenRequest)
            .then(response => {
                // get access token from response
                // response.accessToken
            })
            .catch(err => {
                // could also check if err instance of InteractionRequiredAuthError if you can import the class.
                if (err.name === "InteractionRequiredAuthError") {
                    return msalInstance.acquireTokenPopup(tokenRequest)
                        .then(response => {
                            // get access token from response
                            // response.accessToken
                        })
                        .catch(err => {
                            // handle error
                        });
                }
            });
    } else {
        // user is not logged in, you will need to log them in to acquire a token
    }
    

    【讨论】:

    • 好的,所以使用 msal 我反应应该在标头中获取并发送令牌,所以我的 WebApi 会验证/授权使用令牌吗?另外,在邮递员i.stack.imgur.com/IfqBi.png 中使用此步骤生成的令牌将起作用而不是使用 msal?求您分享详细步骤/博客网址
    • 这取决于您的 web api 中令牌验证的设置是什么,因此您可以获取令牌以访问您的 web api 并传入 header 。 msal 只是帮助发出授权/令牌请求,您也可以使用邮递员来测试请求。 Code samples 供您参考。
    猜你喜欢
    • 2017-08-07
    • 1970-01-01
    • 2021-02-18
    • 2020-04-30
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多