SSO Sustainsys.Saml2.Owin Запрос не аутентифицирован - access_denied - PullRequest
0 голосов
/ 04 июня 2019

Мне нужно выполнить 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?

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

1 Ответ

1 голос
/ 07 июня 2019

(все приведенные здесь коды одного и того же образца от 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 провайдер опубликует samlresponse для вашего приложения (например, 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 для обработки ответов от вашего провайдера. Затем вы можете установить эту DLL на свой сервер и просто добавить обработчик в конфигурацию каждого веб-приложения. Никаких изменений кода не требуется для ваших веб-приложений :).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...