Веб-API (. NET Framework) Azure Аутентификация AD всегда возвращает 401 Несанкционированный - PullRequest
0 голосов
/ 01 марта 2020

Мой сценарий похож на развертывание Web API (. NET Framework) в Azure Web App, и все запросы должны go через Azure Аутентификация AD. Я погуглил и обнаружил аналогичный случай, предоставленный Microsoft. Я следовал приведенному ниже примеру, предоставленному Microsoft, и когда я тестировал этот код на компьютере, он работал нормально.

Собственный клиент для Web API для Web API.

В моем случае я могу сгенерировать токен OAuth2, но проблема в том, что я всегда получаю 401 Unauthorized ошибка. Я следил за многими блогами, но не смог выяснить, что является причиной проблемы. Любая помощь очень ценится.

Вот мой код:

Startup.cs

    public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
    }
}

Startup.Auth.cs

        public void ConfigureAuth(IAppBuilder app)
    {
        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
                TokenValidationParameters = new TokenValidationParameters { ValidAudience = ConfigurationManager.AppSettings["ida:Audience"] }
            });
    }

Контроллер .cs

[Authorize]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class AuthController : ApiController
{
    [HttpGet]
    public HttpResponseMessage Get()
    {
        try
        {
            using (sqldbEntities entities = new sqldbEntities())
            {
                return Request.CreateResponse(HttpStatusCode.OK, (ConfigurationManager.AppSettings["GetMethod"]));
            }
        }
        catch (Exception ex)
        {
            Log4net.log.Error(string.Format(ConfigurationManager.AppSettings["ErrorGetData"], ex.Message));
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
        }
    }

Генерирование токена двумя способами: Метод 1) Из другого ASP. NET приложения

private static AuthenticationContext authContext = null;
        private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
        private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
        private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
        Uri redirectUri = new Uri(ConfigurationManager.AppSettings["ida:RedirectUri"]);

        private static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
        private static string todoListResourceId = ConfigurationManager.AppSettings["todo:TodoListResourceId"];            

protected async void Button1_Click(object sender, EventArgs e)
        {
            authContext = new AuthenticationContext(authority);
            AuthenticationResult result = null;
            result = await authContext.AcquireTokenAsync(todoListResourceId, clientId, redirectUri, new PlatformParameters(PromptBehavior.Always));
            TextBox1.Text = result.AccessToken;
        }

Метод 2) От Почтальона URL: https://login.microsoftonline.com/myad.onmicrosoft.com/oauth2/token

Метод: POST

Тело: grant_type = authorization_code & client_id = 89479d4f-aaaa-4ebf-80f2-13e423431bfb & client_secret = hZn8arHlEM = aaaa-k8TJ_ & redirect_uri = https://NAClient-OBO/&code=AQABAAIAAABeAFzDwllzTYGDLh_qYbH8KZRKktzMuxXp0hM6k1B__lWQrxaikd6wwrYrKZ470UAdr4g1GqAPWja6JgpqsDtLefE23vW80qP7xgVodury28LkGLzL1Mbq0auUeiBaaaa-oCZf11o5EsaSVRVlke6FMkbIn_ppA_GsEBhIAEjxHXXjkrIcp-e4g0G5t9prme4IZ0Sg2_L4MvN6TAyr-nEPGDlnWZLBkRvu8Izsm3RiI_cnneCi1xonZaKBSlsgONIwpgN1bOaz16OVW2uu5lTiz206CSrJtzWeKkitPNUx2Gnn-RnZcCUVDyLxK-eJy8o_ggn_iu7F7kdjKj-b70Gfp5BPYx6fxB4Zyw8tpnWzVkLG7IbLGx9di112u-UGgVSBfWQiO5w3a4Mx2KdDcUihMlVW_mgBUdQi4160AKq1Id9ZcpJEKCT11KWwkO25_q7huCxJ_6-mEU4ADCGjj8hDOtRLGNeZMwhB13rYTN7qGQMmpX491RoldCfpfevva16DhQl5VHbIqspknkK1pFHvh90J47DSg0VihQOIQp1FZ7EgAA&resource=89479d4f-aaaa-4ebf-80f2-13e423431bfb

Пожалуйста, помогите.

1 Ответ

1 голос
/ 03 марта 2020

Согласно моему тесту, мы можем использовать следующие шаги для его реализации

  1. Сконфигурировать Azure AD для вашего веб-API. Для получения более подробной информации, пожалуйста, обратитесь к документу

    a. Создать Azure AD веб-приложение API

    б. Expose API enter image description here

  2. Создание клиентского приложения для доступа к веб-API

  3. Код настройки

    • web api

      a. Startup.cs

       public void ConfigureAuth(IAppBuilder app)
      {
         app.UseWindowsAzureActiveDirectoryBearerAuthentication(
             new WindowsAzureActiveDirectoryBearerAuthenticationOptions
             {
                 Tenant = "<your tenant id>",
                 TokenValidationParameters = new TokenValidationParameters
                 {
                     ValidAudiences = new[] { "your web api application app id url", "your web api application app id" }
                 },
             }) ;;
      }
      

      b. Контроллер

      [Authorize]
      [EnableCors(origins: "*", headers: "*", methods: "*")]
      public class ValuesController : ApiController
      {
      // GET api/values
      public IEnumerable<string> Get()
      {
       return new string[] { "value1", "value2" };
      }
      }
      
    • клиентское приложение. Я использую консольное приложение для вызова API
    var authority = "https://login.microsoftonline.com/<your tenat id>";
          AuthenticationContext authContext = new AuthenticationContext(authority);
          var uri = "< your redirect url>";
          var clientId = "< your client application app id>";
          var resource = "<your web api application app id url or your web api application app id>";
         var result = authContext.AcquireTokenAsync(resource, clientId, new Uri(uri), new PlatformParameters(PromptBehavior.Always)).Result;
    
          using (HttpClient httpClient = new HttpClient())
          {
    
              httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
    
              var response = httpClient.GetAsync("https://localhost:44345/api/values").Result;
              Console.WriteLine(response.StatusCode);
              Console.WriteLine(response.Content.ReadAsStringAsync().Result);
    
          }
    

    enter image description here

...