我们正在开发一个由多个组件组成的应用程序。 我们有两个前端(都使用ASP.NET MVC)和一个后端使用ASP.NET MVC API。
我们需要允许用户使用其O365帐户(例如Azure AD)对自己进行身份验证,并为这些帐户启用单点登录。 我们已经找到了几个博客并尝试了很多,但我们一直收到错误。
这是我们到目前为止所得到的
public class AccountController : BaseController
{
private string Authority = ConfigurationManager.AppSettings["ida:Authority"];
private string Audience = ConfigurationManager.AppSettings["ida:Audience"];
private string AzureClientId = ConfigurationManager.AppSettings["ida:AzureClientId"];
private string AppKey = ConfigurationManager.AppSettings["ida:AppKey"];
private string Tenant = ConfigurationManager.AppSettings["ida:Tenant"];
private static Uri RedirectUri { get; } = new Uri(ConfigurationManager.AppSettings["ida:RedirectUri"]);
private string BaseServiceUrl = ConfigurationManager.AppSettings["ida:BaseServiceUrl"];
public ActionResult LoginO365()
{
var authContext = new AuthenticationContext(Authority);
try
{
var result = Task.Run( async() => await authContext.AcquireTokenAsync(Audience, AzureClientId, RedirectUri, new PlatformParameters(PromptBehavior.Always))).Result;
/..
Some business code
../
return RedirectToAction("SomeAdminPage");
}
catch(Exception ex)
{
return View("Login");
}
}
}
我们现在收到错误: var result = Task.Run(async()=> await authContext.AcquireTokenAsync(Audience,AzureClientId,RedirectUri,new PlatformParameters(PromptBehavior.Always)))。结果; 我们得到弹出窗口并可以输入我们的密码,但随后会抛出错误。
消息如下
{"AADSTS70002: The request body must contain the following parameter: 'client_secret or client_assertion'.\r\nTrace ID: 5042d7a7-4f18-433f-8e9d-424260fe1200\r\nCorrelation ID: 6a0cd62c-f5dd-4f7c-94b0-83df9edfb098\r\nTimestamp: 2017-03-24 11:53:06Z"} System.Exception {Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException}
此消息具有不同的InnerException:
{" Response status code does not indicate success: 401 (Unauthorized)."} System.Exception {System.Net.Http.HttpRequestException}
此消息还有另一个不同的InnerException:
{"{\"error\":\"invalid_client\",\"error_description\":\"AADSTS70002: The request body must contain the following parameter: 'client_secret or client_assertion'.\\r\\nTrace ID: 5042d7a7-4f18-433f-8e9d-424260fe1200\\r\\nCorrelation ID: 6a0cd62c-f5dd-4f7c-94b0-83df9edfb098\\r\\nTimestamp: 2017-03-24 11:53:06Z\",\"error_codes\":[70002],\"timestamp\":\"2017-03-24 11:53:06Z\",\"trace_id\":\"5042d7a7-4f18-433f-8e9d-424260fe1200\",\"correlation_id\":\"6a0cd62c-f5dd-4f7c-94b0-83df9edfb098\"}"} System.Exception
是否有人有使用此类代码的经验并且可以指导我们正确的方向?
提前致谢!
答案 0 :(得分:1)
在Web应用程序中使用授权代码流获取受保护资源的令牌时,您需要提供客户端密钥。您可以使用OpenID Connect ASP.Net OWIN中间件,请参阅以下链接以获取代码示例:
https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect https://github.com/Azure-Samples/active-directory-dotnet-webapp-multitenant-openidconnect(多租户)
如果您想编写自己的代码来实现这一目标,请使用ADAL,以下代码供您参考:
获取授权码:
make
通过代码获取令牌:
public ActionResult Contact()
{
string authorizationUrl = string.Format(
"https://login.microsoftonline.com/{0}/oauth2/authorize?response_type=code&client_id={1}&redirect_uri={2}",
tenantid, clientId, "http://localhost:44344/Home/CatchCode");
return Redirect(authorizationUrl);
}