ASP.NET MVC使用Azure AD进行单点登录

时间:2017-03-24 12:10:00

标签: c# asp.net-mvc asp.net-web-api single-sign-on azure-active-directory

我们正在开发一个由多个组件组成的应用程序。 我们有两个前端(都使用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

是否有人有使用此类代码的经验并且可以指导我们正确的方向?

提前致谢!

1 个答案:

答案 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,以下代码供您参考:

  1. 获取授权码:

    make
  2. 通过代码获取令牌:

    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);          
    }