Добавить аутентификацию SAML в .net WebAPI - PullRequest
0 голосов
/ 10 апреля 2019

Мне нужно добавить аутентификацию SAML в мое веб-приложение (WebAPI Back-End / Angular Front-End) с Azure AD в качестве моего поставщика удостоверений.

Я планирую использовать библиотеку Sustainsys.Saml2, но я не уверен, как правильно использовать методы, предоставляемые библиотекой.

Я уже добавил свое веб-приложение в качестве корпоративного приложения в Azure AD и выполнил необходимые конфигурации SAML единого входа.

Я настроил сустейнс в файле web.config следующим образом:

<sustainsys.saml2 entityId="https://myWebApp/api/saml/login" returnUrl="https://myWebApp/">
  <identityProviders>
    <add 
      entityId="https://sts.windows.net/36tg486z-9l1f/" 
      signOnUrl="https://login.microsoftonline.com/36tg486z-9l1f/saml2"
      metadataLocation="https://login.microsoftonline.com/36tg486z-9l1f/federationmetadata/2007-06/federationmetadata.xml?appid=82fc2g56-2as2"
      allowUnsolicitedAuthnResponse="true"
      loadMetadata="true"
      binding="HttpPost"
    >
    </add>
  </identityProviders>
    <serviceCertificates>
        <add fileName="~/App_Data/Sustainsys.Saml2.Tests.pfx" />
  </serviceCertificates>
</sustainsys.saml2>

Моя идея - написать два API:

1 - API, выполняющий вход в Azure AD:

[HttpGet]
[Route("api/saml/signIn")]
[ResponseType(typeof(void))]
public HttpResponseMessage SignIn()
{
  var context = new HttpContextWrapper(HttpContext.Current);
  HttpRequestBase request = context.Request;

  var opt = Sustainsys.Saml2.Configuration.Options.FromConfiguration;
  var result = CommandFactory.GetCommand(CommandFactory.SignInCommandName).Run(request.ToHttpRequestData(), opt);
  var response = Request.CreateResponse(result.HttpStatusCode);

  if (!string.IsNullOrEmpty(result.SetCookieName))
  {
    var protectedData = HttpRequestData.ConvertBinaryData(MachineKey.Protect(result.GetSerializedRequestState(),HttpRequestBaseExtensions.ProtectionPurpose));

    var cookie = new CookieHeaderValue(result.SetCookieName, protectedData) { HttpOnly = true };
    var cookies = new List<CookieHeaderValue>() { cookie };
    response.Headers.AddCookies(cookies);
  }

  response.Headers.Location = result.Location;
  return response;
}

2 - API, который получает ответ от Azure AD и считывает утверждения в токене SAML:

[HttpPost]
[Route("api/saml/acs")]
[ResponseType(typeof(result))]
public HttpResponseMessage Acs()
{
  var context = new HttpContextWrapper(HttpContext.Current);
  HttpRequestBase request = context.Request;

  var opt = Sustainsys.Saml2.Configuration.Options.FromConfiguration;
  var result = CommandFactory.GetCommand(CommandFactory.AcsCommandName).Run(request.ToHttpRequestData(), opt);

  // ... read claims ...

  // ... build [LoginResult] with claims ...
  var response = Request.CreateResponse(result.HttpStatusCode, [LoginResult]);

  response.Headers.Location = new Uri(result.Location.AbsoluteUri);

  return response;
}

Это правильный способ добавления аутентификации SAML с использованием SustainSys?

...