如何使用C#WEBAPI(基于令牌).netcore

时间:2019-11-24 11:52:01

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

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

通过使用 Billing App ,我们将图表称为WebApis。现在 WebApi应该基于前端应用发送的令牌(基于Auken / Autho的基于令牌的Webapi,没有其他登录弹出窗口)来对用户进行身份验证/授权

  1. 可以通过请求下面的链接

    使用postman-see img生成令牌

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

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

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

Azure的链接很多,但是很少的代码无法使用,对于Azure来说,很少的流程不再可用,并且有大量的代码而不是我真正想要的。

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

哪种方法是正确的1或2,并共享示例代码/链接,感谢任何帮助,

2 个答案:

答案 0 :(得分:1)

据我了解,您有一个名为Billing App的客户端应用程序,它将登录用户并通过基于用户的访问令牌调用API。 如果是这样,则应注册两个应用程序,一个分别是Billing App的客户端应用程序和一个服务端应用程序。对于客户端应用程序,因为这是客户端,所以应使用用户的凭据获取从Azure AD获取的信息,而不是应用程序的客户端机密。要实现此目的,应将其配置为Azure AD上的公共客户端,并启用访问令牌和ID令牌: enter image description here

当您想获取服务端应用程序的调用API时,应在下面授予权限,以确保用户可以通过您的客户端应用程序获得访问令牌(假设“ stanapitest”是服务端应用程序): enter image description here 请注意,请点击 Devchat的授予管理员同意按钮以完成许可授予流程。 enter image description here 完成此过程后,您可以通过密码流获取基于用户的访问令牌:

enter image description here

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

确定服务时间,演示.net核心Api,让我们在VS中创建一个简单的.net核心Api项目:

enter image description here

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

运行该项目并调用它的API,如您所见,它已经受到Azure AD的保护: enter image description here

使用基于用户的访问令牌来调用此API: enter image description here

如您所见,它的工作与exception一样。希望能帮助到你 。如果您还有其他疑问,请随时告诉我。

答案 1 :(得分:0)

在Billing应用程序中进行身份验证之后,当您想要获取访问令牌来访问另一个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
}