Задать вопрос
zodchiy
@zodchiy
Фуллстэк с 2005

Как интегрировать аутентификацию для Sharepoint 2013 из сайта на ASP.NET MVC 5 с ASP.NET Identity 2?

Дано: есть кучка сайтов на ASP.NET MVC 5 на одном домене. Аутентификация происходит на одном, "главном" сайте, с помощью ASP.NET Identity 2 + Thinktecture Resource Authorization. Т.к. аутентификация происходит в куке, а кука доступна всем поддоменам, то аутентификация происходит прозрачно (через Resource Authorization). Плюс есть небольшой API для того, чтобы пользователи также прозрачно входили на корпоративный портал на битрикс-24.
Надо: появляется еще один сайт - на sharepoint 2013. Надо его заинтегрировать в ту-же систему аутентификации (ASP.NET Idenity 2), достаточно даже просто аутентификации без авторизации. Для начала даже это пойдет.
  • Вопрос задан
  • 386 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Buzzz
@Buzzz
SharePoint | Office 365 | .Net Developer
Вы можете попробовать посмотреть в сторону Membership provider и Role manager т.к. SP поддерживает использование сторонних identity провайдеров, я думаю что Idenity 2 поддерживает все что нужно для SP.
520298f2a6944b98bf5bb7acaa334825.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zodchiy
@zodchiy Автор вопроса
Фуллстэк с 2005
Реализовал так:
- создал кастомный view web part
- в настройках сайта Custom login page указал адрес своей view web part
- воткнул в code-behind, не забыв добавить machinekey такой-же как и у сайта который является SSO-провайдером, код который дергает текущее имя пользователя
private static string GetUserFromCoockie()
        {
            string username = "";
            var request = HttpContext.Current.Request;
            var cookie = request.Cookies.Get(".AspNet.ApplicationCookie");
            if(cookie == null) { return String.Empty; } //coockie is null!!!
            var ticket = cookie.Value;
            ticket = ticket.Replace('-', '+').Replace('_', '/');
            var padding = 3 - ((ticket.Length + 3) % 4);
            if (padding != 0)
                ticket = ticket + new string('=', padding);
            var bytes = Convert.FromBase64String(ticket);
            try {
            bytes = System.Web.Security.MachineKey.Unprotect(bytes,
                "Microsoft.Owin.Security.Cookies.CookieAuthenticationMiddleware",
                "ApplicationCookie", "v1");
            }
            catch(Exception ex)
            {
                return String.Empty; //u lost machine key!!! stupid idiot 
            }
            using (var memory = new MemoryStream(bytes))
            {
                using (var compression = new GZipStream(memory, CompressionMode.Decompress))
                {
                    using (var reader = new BinaryReader(compression))
                    {
                        reader.ReadInt32(); // Ignoring version here
                        string authenticationType = reader.ReadString();
                        reader.ReadString(); // Ignoring the default name claim type
                        reader.ReadString(); // Ignoring the default role claim type
                        int count = reader.ReadInt32(); // count of claims in the ticket
                        var claims = new Claim[count];
                        for (int index = 0; index != count; ++index)
                        {
                            string type = reader.ReadString();
                            type = type == "\0" ? ClaimTypes.Name : type;
                            string value = reader.ReadString();
                            string valueType = reader.ReadString();
                            valueType = valueType == "\0"
                                ? "http://www.w3.org/2001/XMLSchema#string"
                                : valueType;
                            string issuer = reader.ReadString();
                            issuer = issuer == "\0" ? "LOCAL AUTHORITY" : issuer;
                            string originalIssuer = reader.ReadString();
                            originalIssuer = originalIssuer == "\0" ? issuer : originalIssuer;
                            claims[index] = new Claim(type, value, valueType, issuer, originalIssuer);
                        }

                        var identity = new ClaimsIdentity(claims, authenticationType,
                            ClaimTypes.Name, ClaimTypes.Role);
                        username = identity.Name;
                    }
                }
                }

            return username;
        }

- после этого пользователя авторизую
- работает :)
p.s. знаю, решение "в лоб", есть вопросы безопасности, но я решил, что если будет скопроментирован провайдер SSO, то и кому доверять тогда?
p.p.s. если надо кому, могу и код авторизации пользователя выложить
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы