Forguncy에서 작성한 애플리케이션에서 다른 웹 애플리케이션 및 클라우드 서비스 자격 증명을 사용하는 소위 싱글 사인온을 구현하는 경우 인증 공급자의 사용을 고려하십시오.
인증 프로바이더로 실현이 불가능한 경우, 프로그래밍에 의한 커스터마이즈에 의해 싱글 사인온이 가능합니다. 이 섹션에서는 이러한 경우에 싱글 사인온 방법을 설명합니다. 이 기능은 Windows 인증에서는 사용할 수 없습니다.
Forguncy의 인증 연계 기능은 아래 그림과 같은 흐름으로 이루어집니다.
1. 사용자 토큰을 요청합니다.
사용자의 토큰을 요청하려면 다음 사양을 충족하는 HTTP 요청을 수행합니다.
http://<서버 이름>/<응용 프로그램 경로>/SSO/GetUserToken
인증하려는 Forguncy 사용자 이름과 인증 연동 암호가 있는 JSON
예)
{userName:"user1", password:"6s6s6s6s6s6s"}
위의 메시지 본문에 포함된 비밀번호는 다른 응용 프로그램에서 로그인을 허용할 때 설정된 응용 프로그램에 공통된 암호입니다. 이 암호는 다음 위치에서 확인 및 변경할 수 있습니다.
[파일] → [옵션] → [기타 응용 프로그램과 통합]을 선택하여 [다른 응용 프로그램의 서명 허용]을 선택합니다.
다른 응용 프로그램에서 로그인 허용을 선택하지 않으면 사용자의 토큰을 요청할 수 없습니다.
2.사용자 토큰을 받습니다.
토큰을 요청하는 HTTP 요청이 성공하면 토큰이 응답으로 반환됩니다. 토큰을 요청하는 HTTP 요청이 실패하면 반환되는 토큰은 "Error:" 문자열로 시작합니다.
3.토큰을 쿼리 문자열(URL 매개 변수)로 지정하여 전환하려는 Forguncy 응용 프로그램의 페이지로 전환합니다.
http://<서버명>/<응용프로그램>/?token=1h1h1h1h-1h1h-1h1h-1h1h-1h1h1h1h1h1h
2단계에서 토큰을 받은 후 3단계를 수행할 때까지의 제한 시간은 기본적으로 10초로 설정됩니다. 이를 변경하려면 다음과 같이 하십시오.
[파일] → [옵션] → [응용 프로그램 연동]을 선택하여 [토큰 만료]를 변경합니다.
샘플코드
C#의 경우의 샘플 코드는 2개 이하에 나타냅니다.
Forguncy 애플리케이션이 HTTPS 통신 또는 기존 애플리케이션에서 신뢰할 수 있는 네트워크인 경우 이전 샘플 코드를 사용하십시오.
C#(구)
internal class Program
{
static HttpClient client = new HttpClient();
static async Task Main( string [] args)
{
var baseUrl = "http://localhost:47054/Forguncy" ;
var userName = "administrator" ;
var password = "@ddRUvpPgb^6" ;
var ssoResponse = await client.PostAsync(baseUrl + "/SSO/GetUserToken" , JsonContent.Create( new Dictionary
{
{ "userName" ,userName },
{ "password" ,password }
}));
var token = await ssoResponse.Content.ReadAsStringAsync();
if (token.StartsWith( "Error:" ))
{
Console.WriteLine(token);
return ;
}
var str = baseUrl + "?token =" + token;
}
}
C#(신규)
internal class Program
{
static HttpClient client = new HttpClient();
static async Task Main( string [] args)
{
var baseUrl = "http://localhost : 52839/Forguncy" ;
var userName = "administrator" ;
var
password = "Nk0u1w&yXqwh" ;
var publicKeyRespose = await client.PostAsync(baseUrl + "/SSO/ GetRSAPublicKey publicKey = await publicKeyRespose.Content.ReadAsStringAsync();
var encryptPassword = EncryptDataWithPemPublicKey (password, publicKey);
var ssoResponse = await client.PostAsync(baseUrl + " /SSO/ GetUser
{
{ "userName" ,userName },
{ "password" ,encryptPassword },
{ "publicKey" ,publicKey },
}));
var token = await ssoResponse.Content.ReadAsStringAsync();
if (token.StartsWith( "Error:" ))
{
Console.WriteLine(token);
return ;
}
var str = baseUrl + "?token =" + token;
}
public static string EncryptDataWithPemPublicKey( string dataToEncrypt, string pemPublicKey)
{
using RSA rsa = RSA.Create();
rsa.ImportFromPem(pemPublicKey.ToCharArray());
byte [] dataBytes = Encoding.UTF8.GetBytes(dataToEncrypt);
byte [] encryptedData = rsa.Encrypt(dataBytes, RSAEncryptionPadding.Pkcs1);
return Convert.ToBase64String(encryptedData);
}