User.Identity.IsAuthenticated остается ложным после входа в систему - PullRequest
0 голосов
/ 11 мая 2019

У меня есть приложение MVC, которое я пытаюсь заставить использовать Salesforce в качестве sso idp.Я могу заставить его перенаправить в Salesforce для входа в систему.Но после того, как я вошел в систему, следующее не работает, как я ожидал: 1) User.Identity.IsAuthenticated остается ложным.Итак, на странице указателя отображается сообщение «Вы еще не авторизованы».даже если у меня есть логин.2) Если я нажму на ссылку «О программе», она перенаправит меня на страницу индекса, если я уже выполнил вход.Если нет, то для входа в систему Salesforce мне нужно войти, а затем перейти на страницу индекса, на которой будет отображаться сообщение «Вы еще не вошли в систему».

Ниже приведена информация о моем приложении MVC.

Web.config:

<sustainsys.saml2 entityId="http://xxxx.xxxx.com/SAML2" returnUrl="http://localhost:51048/Home/Index" authenticateRequestSigningBehavior="Never">
    <nameIdPolicy allowCreate="true" format="Persistent" />
    <metadata cacheDuration="PT1H" validDuration="7.12:00:00" wantAssertionsSigned="true">
      <organization name="xxxx Inc" displayName="xxxx" url="https://www.xxxx.com" language="en" />
      <contactPerson type="Support" email="lim.hock-chai@xxxx.com" />
      <requestedAttributes>
        <add friendlyName="User Name" name="urn:Username" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true" />
        <add name="Minimal" />
      </requestedAttributes>
    </metadata>
    <identityProviders>
      <add entityId="https://xxxx.my.salesforce.com" signOnUrl="https://xxxx.xxx.my.salesforce.com/idp/login?app=xxxxxxxxxxx" allowUnsolicitedAuthnResponse="true" binding="HttpRedirect">
        <signingCertificate fileName="~/App_Data/SelfSignedCert_10Oct2017.crt" />
      </add>
    </identityProviders>
</sustainsys.saml2>  

Домашний контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [Authorize]
    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

    public ActionResult Contact()
    {
        ViewBag.Message = "Your contact page.";

        return View();
    }
}

Страница указателя:

@{
    ViewBag.Title = "Home Page";
 }
<div class="row">
    @if (User.Identity.IsAuthenticated)
    {
        <div class="col-md-4">
            <h2>Hello @User.Identity.Name</h2>
            <p>
                Welcome.
            </p>
        </div>
    }
    else
    {
        <div class="col-md-4">
            <h2>Hello</h2>
            <p>
                You are not login yet.  Click <a href="@Url.Content("~/Saml2/SignIn")">here</a> to login
            </p>
        </div>
    }
    </div>

О странице:

@{
ViewBag.Title = "About";
}
<h2>@ViewBag.Title.</h2>
<h3>@ViewBag.Message</h3>

<p>Use this area to provide additional information.</p>

1 Ответ

0 голосов
/ 14 мая 2019

Я нашел причину проблемы.Это было вызвано тем, что я установил неправильную ссылку ACS при настройке подключенного приложения в salesforce.Ссылка acs должна быть / Saml2 / Acs, чтобы она работала (например: http://mysite/Saml2/Acs). Это исправило мою проблему «User.Identity.IsAuthenticated остается ложной». Но после этого я столкнулся с двумя дополнительными проблемами.

Один из них связан с продажами с использованием шифрования SHA1, что неприемлемо для saml2. Для этого я добавил атрибут minIncomingSigningAlgorithm = "SHA1" к элементу SustainS.saml2 в web.config, чтобы обойти проблему:

  <sustainsys.saml2 .... minIncomingSigningAlgorithm="SHA1">

Другая проблема связана с тем, что salesforce не включает в ответ элемент InResponseTo. Для этого я добавил атрибут ignoreMissingInResponseTo, чтобы пропустить ошибку:

<sustainsys.saml2 ....>
     ....   
     <compatibility ignoreMissingInResponseTo="true">
     </compatibility>
     ....
</sustainsys.saml2>
...