SSO Sustainsys.Saml2.Owin Запрос не аутентифицирован - access_denied

Мне нужно выполнить аутентификацию SSO с помощью saml2 для моего существующего веб-приложения asp.net.

Для этого я использую пример Sustainsys.Saml2.Owin.

Поставщик удостоверений - Azure ADFS (https://sts.windows.net/TENANTID)

Я настроил файл запуска. Он загружает файл метаданных и сертификат.

И на моей странице входа в систему я затрудняюсь, если не аутентифицирован.

Он успешно перенаправляется на страницу входа в систему, но запрос никогда не аутентифицируется после входа в систему. И в ответном URL мы получаем error = access_denied.

[ни для Request.IsAuthenticated, ни для owinContext.Authentication.User.Identity.IsAuthenticated не задано значение true]

Таким образом, он продолжает вызывать много раз и ошибаться с плохим запросом.

Что я делаю не так? Какой модуль Owin / Sustainsys поддерживает установку статуса IsAuthenticated?

* Saml2. cookie [Saml2.DAeP63c *** UTX0h *** _ ***] передается вместе с запросом после входа в Microsoft [https://login.microsoftonline.com/TENANTID/saml2]

Файл Startup.cs

    public void ConfigureAuth(IAppBuilder appBuilder)
    {
        try
        {
            appBuilder.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

            appBuilder.UseCookieAuthentication(new CookieAuthenticationOptions());

            appBuilder.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            appBuilder.UseSaml2Authentication(CreateSaml2Options());
        }
        catch (Exception exp)
        {

        }
    }


    private Saml2AuthenticationOptions CreateSaml2Options()
    {
        try
        {
            var spOptions = CreateSPOptions();

            var Saml2AuthOptions = new Saml2AuthenticationOptions(false)
            {
                SPOptions = spOptions,
                Notifications = new Saml2Notifications(),
            };

            var idp = new IdentityProvider(new EntityId(authority), spOptions)
            {
                MetadataLocation = metadataLocation,
                Binding = Saml2BindingType.HttpRedirect
            };

            idp.SigningKeys.AddConfiguredKey(
                new X509Certificate2(certificateLocation));

            Saml2AuthOptions.IdentityProviders.Add(idp);

            return Saml2AuthOptions;
        }
        catch (Exception exp)
        {
        }
    }

    private SPOptions CreateSPOptions()
    {
        try
        {
            var engAus = "en-AU";

            var organization = new Organization();

            var spOptions = new SPOptions
            {
                EntityId = new EntityId(ApplicationId),
                ReturnUrl = new Uri(redirectUrl),
                Organization = organization,
            };

            return spOptions;
        }
        catch (Exception exp)
        {
        }
    }

Login.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        IOwinContext owinContext = HttpContext.Current.GetOwinContext();

        //if (Request.IsAuthenticated)
        if (owinContext.Authentication.User != null &&
            owinContext.Authentication.User.Identity != null &&
            owinContext.Authentication.User.Identity.IsAuthenticated)
        {
            //Authenticated
            string name = owinContext.Authentication.User.Identity.Name;
        }
        else
        {
            var authenticationTypes = owinContext.Authentication.GetAuthenticationTypes().Select(d => d.AuthenticationType).ToArray();

            owinContext.Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, authenticationTypes);
        }
    }
}

person Derin    schedule 04.06.2019    source источник


Ответы (1)


(весь код, размещенный здесь, является одним и тем же образцом из Github)

Вам нужно понять, как работает SAML, вот простой класс реализации saml, который я использовал, прежде чем погрузиться в SustainsysSAML. AspNetSaml

Это основной процесс внедрения SAML:

  1. Пользователь получает доступ к вашему приложению, если пользователь еще не прошел аутентификацию, ваше приложение должно перенаправить пользователя к вашему провайдеру saml.

    //specify the SAML provider url here, aka "Endpoint"
    var samlEndpoint = "http://saml-provider-that-we-use.com/login/";
    
    var request = new AuthRequest(
    "http://www.myapp.com", //put your app's "unique ID" here
    "http://www.myapp.com/SamlConsume" //assertion Consumer Url - the redirect URL where the provider will send authenticated users
    );
    
    //generate the provider URL
    string url = request.GetRedirectUrl(samlEndpoint);
    
    //then redirect your user to the above "url" var
    //for example, like this:
    Response.Redirect(url);
    
  2. От поставщика saml пользователь вводит учетные данные, и, если пользователь действителен, поставщик saml аутентифицирует и перенаправляет пользователя в ваше приложение.

  3. Поставщик SAML отправит ответ Saml в ваше приложение (например, http://www.myapp.com/SamlConsum).

    //ASP.NET MVC action method... But you can easily modify the code for Web-forms etc.
    public ActionResult SamlConsume()
    {
        //specify the certificate that your SAML provider has given to you
        string samlCertificate = @"-----BEGIN CERTIFICATE-----
    BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH123543==
    -----END CERTIFICATE-----";
    
        Saml.Response samlResponse = new Response(samlCertificate);
        samlResponse.LoadXmlFromBase64(Request.Form["SAMLResponse"]); //SAML providers usually POST the data into this var
    
        if (samlResponse.IsValid())
        {
            //WOOHOO!!! user is logged in
            //YAY!
    
            //Some more optional stuff for you
            //lets extract username/firstname etc
            string username, email, firstname, lastname;
            try
            {
                username = samlResponse.GetNameID();
                email = samlResponse.GetEmail();
                firstname = samlResponse.GetFirstName();
                lastname = samlResponse.GetLastName();
            }
            catch(Exception ex)
            {
                //insert error handling code
                //no, really, please do
                return null;
            }
    
            //user has been authenticated, put your code here, like set a cookie or something...
            //or call FormsAuthentication.SetAuthCookie() or something
        }
    }
    
  4. Ваше приложение прочитает ответ samlresponse и, если он действителен, позволит пользователю использовать ваше приложение, ваше приложение теперь будет обрабатывать роли пользователя в зависимости от ваших политик.

Несколько советов:

  1. Убедитесь, что ваше приложение идентифицируется вашим поставщиком SAML.
  2. Используйте Firebug для отслеживания ваших HTTP-запросов (или любого инструмента отслеживания HTTP)
  3. Понять разницу между samlresponse и samlrequest
  4. Используя Firebug, вы должны увидеть ответ samlresponse.
  5. Если у вас есть несколько веб-приложений, для которых вы хотите использовать единый вход с использованием вашего поставщика Saml. Я предлагаю вам создать httprequest / httphandler для обработки ответов samlresponse от вашего провайдера. Затем вы можете установить эту dll на свой сервер и просто добавить обработчик в конфигурацию каждого веб-приложения. Для ваших веб-приложений не требуется изменение кода :).

Надеюсь, это поможет.

person jomsk1e    schedule 07.06.2019
comment
ссылка находится на моем ответе выше, и, как я сказал в первой строке своего ответа. (весь код, размещенный здесь, является одним и тем же образцом из Github) - person jomsk1e; 17.06.2019
comment
Моя проблема на самом деле заключается в том, что я не получаю SAMLResponse в Request.Form. - person Derin; 18.06.2019
comment
Все, что я вижу, это файл cookie [Saml2. cookie] в запросе. Как мне это обработать? - person Derin; 18.06.2019
comment
вы сможете увидеть его с помощью Firebug, когда ваш SAMLProvider отправит SAMLResponse на ваш сайт. - person jomsk1e; 18.06.2019
comment
да. Я использую firebug. но нет ответа SAML - person Derin; 20.06.2019