Нашел два способа сделать это. Одним из них является использование TcpListener
и привязка к Loopback IP. Ответ возвращается в виде потока, который вам понадобится для дальнейшего анализа, чтобы получить нужные данные, и это огромная боль.
Другой способ - использовать HttpListener
using (HttpListener listener = new HttpListener())
{
listener.Prefixes.Add("http://localhost:{port}/"); //Only listen to this particular address
listener.Start();
//blocking call. Feel free to use async version
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
//Here is the response url. The token should be inside url query param.
Console.WriteLine(request.Url);
//redirects user back to your site and show a login success screen
response.Redirect("{yourdomain}/loginsuccess");
//Important! call close to send out the response
response.Close();
//Important! If listener is stopped before response is sent out then it will abort.
Thread.Sleep(1000);
listener.Stop();
}
На стороне сервера просто перенаправьте пользователя на http://localhost:{port}/?token=xxxx
после завершения входа в систему.
реализация asp.net:
В Startup.Auth.cs
добавить статическое поле
public static TicketDataFormat AccessTokenFormat;
в ConfigureAuth
до
AccessTokenFormat = new TicketDataFormat(app.CreateDataProtector(typeof(OAuthAuthorizationServerMiddleware).Namespace, "Access_Token", "v1"));
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
Для генерации токена
TimeSpan tokenExpiration = TimeSpan.FromDays(1);
ClaimsIdentity identity = new ClaimsIdentity(OAuthDefaults.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, "a@a.com"));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, "999"));
AuthenticationProperties props = new AuthenticationProperties()
{
IssuedUtc = DateTime.UtcNow,
ExpiresUtc = DateTime.UtcNow.Add(tokenExpiration),
};
AuthenticationTicket ticket = new AuthenticationTicket(identity, props);
string accessToken = Startup.AccessTokenFormat.Protect(ticket);
С помощью этого метода пользователь даже не заметит, что мы переадресовали его / ее на localhost. URL браузера будет показывать домен вашего сайта все время.