SSO: 2 проекта: автоматический вход во второй проект

У меня есть проекты: мой собственный, назовем его Интранет, а второй - MVCForum ( http://mvcforum.com/). Цель: при входе пользователя в мою интранет и переходе по ссылке на форум - он автоматически перенаправляется и авторизуется.

Что я делал до сих пор, так это то, что я могу отправить данные (имя пользователя и пароль) в метод LogOn в MVCForum MembersController. Все идет очень хорошо, все выглядит точно так же, как когда я обычно захожу на форум. Но кое-как, как после того, как меня перенаправили (со страницы входа на форум на основной сайт на форуме) я не залогинен:(

Я провел последние 3 дня с этим и ничего. intranet: localhost:55123 forum: localhost:9666 Существует одна база данных для форума и другая для интрасети: не связаны друг с другом - пока я оставлю это.

Оба проекта находятся в одном решении. Вот мой код: 1. Мой редирект на форум (в одном из контроллеров интрасети):

public async Task<ActionResult> Forum()
    {

        string url = "http://localhost:9666/Members/Logon";
        Uri address = new Uri(url);
        var postData = new List<KeyValuePair<string, string>>
                           {
                               new KeyValuePair<string, string>("UserName", "admin"),
                               new KeyValuePair<string, string>("Password", "password"),
                                new KeyValuePair<string, string>("RememberMe", "False")
                           };

        HttpContent content = new FormUrlEncodedContent(postData);
        var cookieJar = new CookieContainer();
        var handler = new HttpClientHandler
        {
            CookieContainer = cookieJar,
            UseCookies = true,
            UseDefaultCredentials = false
        };

        var client = new HttpClient(handler)
        {
            BaseAddress = address
        };


        HttpResponseMessage response = await client.PostAsync(url, content);
        response.EnsureSuccessStatusCode();
        string body = await response.Content.ReadAsStringAsync();

        Uri uri = new Uri(url);
        var responseCookies = cookieJar.GetCookies(uri);
        foreach (Cookie cookie in responseCookies)
        {
            cookieJar.Add(cookie);
            string cookieName = cookie.Name;
            string cookieValue = cookie.Value;
            this.Response.Cookies.Add(new HttpCookie(cookie.Name, cookie.Value){Domain = cookie.Domain, Expires = cookie.Expires});
        }

        var person = new Person { Name = "name1" };

        var mod = new LogOnViewModel
                      {
                          Password = "password",
                          RememberMe = false,
                          ReturnUrl = null,
                          UserName = "admin"
                      };


        return this.Redirect("http://localhost:9666/"); 
    }
  1. web.config из внутренней сети:

 <authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" name=".ASPXFORMSAUTH"
         protection="Validation"
         path="/"
         domain="localhost"/>
</authentication>
<machineKey validationKey="D4499A4E3540646431DAFBA7462C3A8220447D7C49DEA6F6A2DD94D9A400DBBEBDC8020856FD91B353087716C3E320902508249FEDA4F10E517F799669ADA762"
         decryptionKey="897B17754EB63518A45E9C209B7ADD542B5D09B4D2ED03C024EF07E4BF169387"
         validation="SHA1" decryption="Auto" compatibilityMode="Framework20SP1"/>
  1. Метод входа в MVCForum:

    public ActionResult LogOn (модель LogOnViewModel) {использование (var unitOfWork = UnitOfWorkManager.NewUnitOfWork()) { var username = model.UserName; var password = model.Password;

            try
            {
                if (ModelState.IsValid)
                {
                    var message = new GenericMessageViewModel();
                    var user = new MembershipUser();
                    if (MembershipService.ValidateUser(username, password, System.Web.Security.Membership.MaxInvalidPasswordAttempts))
                    {
                        // Set last login date
                        user = MembershipService.GetUser(username);
                        if (user.IsApproved && !user.IsLockedOut)
                        {
                            FormsAuthentication.SetAuthCookie(username, model.RememberMe);
                            HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(new FormsAuthenticationTicket(1, model.UserName, DateTime.Now, DateTime.Now.AddMinutes(15),false,user.Id.ToString() )));
    
                            Response.Cookies.Add(cookie);
                            user.LastLoginDate = DateTime.UtcNow;
    
                            if (Url.IsLocalUrl(model.ReturnUrl) && model.ReturnUrl.Length > 1 && model.ReturnUrl.StartsWith("/")
                                && !model.ReturnUrl.StartsWith("//") && !model.ReturnUrl.StartsWith("/\\"))
                            {
                                return Redirect(model.ReturnUrl);
                            }
    
                            message.Message = LocalizationService.GetResourceString("Members.NowLoggedIn");
                            message.MessageType = GenericMessages.success;
    
                            return RedirectToAction("Index", "Home", new { area = string.Empty });
                        }
    
                    }
    
                    // Only show if we have something to actually show to the user
                    if (!string.IsNullOrEmpty(message.Message))
                    {
                        TempData[AppConstants.MessageViewBagName] = message;
                    }
                    else
                    {
                      (...)
                        }
                    }
                }
            }
    
            finally
            {
                try
                {
                    unitOfWork.Commit();
                }
                catch (Exception ex)
                {
                    unitOfWork.Rollback();
                    LoggingService.Error(ex);
                }
    
            }
    
            return View(model);
        }
    }
    
  2. Web.config проекта MVCForum:

<authentication mode="Forms">
  <forms loginUrl="~/members/logon" timeout="2880"  name=".ASPXFORMSAUTH"
         protection="Validation"
         path="/"
         domain="localhost"/>
</authentication>
<machineKey validationKey="D4499A4E3540646431DAFBA7462C3A8220447D7C49DEA6F6A2DD94D9A400DBBEBDC8020856FD91B353087716C3E320902508249FEDA4F10E517F799669ADA762"
          decryptionKey="897B17754EB63518A45E9C209B7ADD542B5D09B4D2ED03C024EF07E4BF169387"
          validation="SHA1" decryption="Auto" compatibilityMode="Framework20SP1"/>

Я не очень понимаю, почему это не работает. Не знаю, какой другой код может быть полезным. Имя machineKey и cookie являются одинаковыми, потому что я прочитал, что это должно быть то же самое, чтобы достичь желаемого. Пожалуйста, помогите мне с этим.

0 ответов

Другие вопросы по тегам