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