繁体   English   中英

如何使用 C# WEBAPI(基于令牌).netcore 进行身份验证和授权 Azure AD 应用程序

[英]How to do Authentication & Authorization Azure AD App, using C# WEBAPI (token based) .netcore

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

通过使用Billing App,我们将调用图表 WebApis。 现在WebApi 应该根据前端应用程序发送的令牌对用户进行身份验证/授权(基于令牌的 webapi 执行身份验证/身份验证,没有其他登录弹出窗口)

  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 中托管一个执行身份验证部分的应用程序,现在 WebApi 也应该使用相同的用户 cookie/令牌进行身份验证,因为我不想给出另一个登录弹出窗口,请参阅很多 MS 示例代码,但没有运气

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

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

由于您想获取服务端应用程序的调用 API,您应该授予以下权限以确保用户可以通过您的客户端应用程序获取访问令牌(假设这里的“stanapitest”是服务端应用程序): 在此处输入图片说明 请注意,请单击授予 Devchat 管理员同意按钮以完成权限授予流程。 在此处输入图片说明 完成此过程后,您可以通过密码流获取基于用户的访问令牌:

在此处输入图片说明

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

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

在此处输入图片说明

创建项目后,将客户端 ID 更改为您的服务应用程序 ID: 在此处输入图片说明

运行该项目并调用它的 API,如您所见,它已受到 Azure AD 的保护: 在此处输入图片说明

使用基于用户的访问令牌调用此 API: 在此处输入图片说明

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

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

最好让你的web api作为受AAD保护的独立资源,在你的前端react app中,你可以使用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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM