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/");
}
- 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"/>
Метод входа в 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); } }
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 являются одинаковыми, потому что я прочитал, что это должно быть то же самое, чтобы достичь желаемого. Пожалуйста, помогите мне с этим.