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

    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. если надо кому, могу и код авторизации пользователя выложить
    Ответ написан
    Комментировать