2016-03-21 2 views
1

Мы пытаемся создать следующий сценарий:Использование WebAPI для проверки подлинности ADFS

Html страница отправляет запрос Аякса WebAPI с просьбой Wheter пользователь имеет определенную роль пользователя или нет. WebApi проверяет из ADFS, если пользователь вошел в систему (если нет, WebApi аутентифицирует пользователя). Затем WebApi считывает роли пользователей из ADFS и возвращает true/false на страницу html.

Что мы имеем до сих пор:

Ajax посылает Get-запрос на WebAPI. В WebApi у нас есть Authorize-tag, который правильно отправляет пользователя в ADFS-аутентификацию. Однако после аутентификации ADFS возвращает html-страницу, содержащую информацию saml, клиенту вместо WebApi. Итак, теперь мы создаем еще один запрос ajax (post this time), который получил html-страницу в качестве данных. Затем WebApi анализирует это и возвращает true/false на основе пользовательских ролей в SAML-ответе.

Вопросы:

  1. В настоящее время используется механизм кажется неуклюжим. Является ли этот механизм правильным или есть лучший способ сделать это?

  2. Если мы используем метод выше, есть ли возможность, что пользователь редактирует полученную html-страницу и дает себе роли, которых у него на самом деле нет?

  3. Даже если вышеуказанный механизм верен, мы все еще имеем ошибку cors, когда WebApi перенаправляется на аутентификацию. Cors включен в Startup.cs WebApi. Как мы можем избавиться от этого?

коды:

Ajax:

var uri = 'api/user'; 
$(document).ready(function() { 
     $.ajax({ 
     url: uri, 
     type: "Get", 
     success: function (data) { 
      $.ajax({ 
       url: uri, 
       type: "POST", 
       data: data, 
       success: function (value) { 
        if (value == true) { 
          $('#userData').text('You have correct role.'); 
        } 
        else { 
          $('#userData').text('You don't have correct role.'); 
        } 
       }, 
       error: function (jqXHR, textStatus, err) { 
         window.location.href = "NotLoggedIn.html"; 
       } 
      }) 
     }, 
     error: function (jqXHR, textStatus, err) { 
       window.location.href = "NotLoggedIn.html"; 
     } 
    }); 
}); 

Startup.Auth.cs:

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType); 

    app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions 
    { 
      MetadataAddress = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"], 
      Wtrealm = ConfigurationManager.AppSettings["ida:Audience"], 

    }); 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
      AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType 
    }); 
} 

UserController:

namespace SSOWebApiSample.Controllers{ 
    [RoutePrefix("api/user")] 
    public class UserController : ApiController 
    { 
      [HttpGet] 
      [Route("")] 
      [Authorize] 
      public IHttpActionResult GetUser() 
      { 
        return Ok(); 
      } 

      [HttpPost] 
      [Route("")] 
      public async Task<IHttpActionResult> PostUser() 
      { 
        bool isAdditionalInfoAllowedUser = false; 
        string result = await Request.Content.ReadAsStringAsync(); 
        //Parse result here 
        return Ok(isAdditionalInfoAllowedUser); 
      } 
    } 
} 

ответ

0

AdalJS очистит это красиво. Пожалуйста, обратитесь к следующему:

  1. To Do application adapted from Azure AD to ADFS
  2. Azure AD sample with CORS
  3. Enabling Cross-Origin Requests in ASP.NET Web API 2

Для успешного CORS Web API вызовов с проверкой подлинности ADFS, я обнаружил, необходимо установить экземпляр, арендатор, ClientId, и Конечные точки членов при вызове adalAuthenticationService.init() в моей конфигурации Angular app. См. Пример 2 для примера конечных точек, но замените GUID на URL.

Смежные вопросы