我能够为.netcore MVC应用程序+ reactjs(计费应用)进行身份验证和授权 此应用程序将托管在IIS上,并在计划托管.netcore Webapi的同一服务器上 (图表应用)。
通过使用 Billing App ,我们将图表称为WebApis。现在 WebApi应该基于前端应用发送的令牌(基于Auken / Autho的基于令牌的Webapi,没有其他登录弹出窗口)来对用户进行身份验证/授权
可以通过请求下面的链接
使用postman-see img生成令牌https://login.microsoftonline.com/ {{tenandId}} / oauth2 / token
会将带有标头的令牌发送到Web-API,该API将具有与Billing App相同的Azure AD应用程序配置(客户端ID,范围等)。 Api应该验证令牌并发送图表数据。
Azure的链接很多,但是很少的代码无法使用,对于Azure来说,很少的流程不再可用,并且有大量的代码而不是我真正想要的。
基本上,我将在.netcore中托管一个执行身份验证功能的应用程序,现在,WebApi也应该使用相同的用户cookie /令牌进行身份验证,因为我不想提供另一个登录弹出窗口,请参见很多MS示例代码,但运气
哪种方法是正确的1或2,并共享示例代码/链接,感谢任何帮助,
答案 0 :(得分:1)
据我了解,您有一个名为Billing App的客户端应用程序,它将登录用户并通过基于用户的访问令牌调用API。 如果是这样,则应注册两个应用程序,一个分别是Billing App的客户端应用程序和一个服务端应用程序。对于客户端应用程序,因为这是客户端,所以应使用用户的凭据获取从Azure AD获取的信息,而不是应用程序的客户端机密。要实现此目的,应将其配置为Azure AD上的公共客户端,并启用访问令牌和ID令牌:
当您想获取服务端应用程序的调用API时,应在下面授予权限,以确保用户可以通过您的客户端应用程序获得访问令牌(假设“ stanapitest”是服务端应用程序): 请注意,请点击 Devchat的授予管理员同意按钮以完成许可授予流程。 完成此过程后,您可以通过密码流获取基于用户的访问令牌:
或OAuth2 grant code flow或Oauth2隐式授予流程,这当然取决于您的要求。
确定服务时间,演示.net核心Api,让我们在VS中创建一个简单的.net核心Api项目:
运行该项目并调用它的API,如您所见,它已经受到Azure AD的保护:
如您所见,它的工作与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
}