You are not logged in.
Pages: 1
Thank you all for your help.
All works fine now, i just couldn't see the forest for the trees.
Hello all together,
once more i need your help.
We have the following situation:
We developed our Mormot Server on a single machine (localhost) as a Rest Server which serve JSON Content via Interface and Method based Services.
All work fine. We developed an angular application as frontend as well.
Now we want to host the Mormot Server on our Production Server. This is a virtual Server which is hosted in a Cloud.
This Server got IIS installed and got multiple Sites configured on the port 80 and 443 (for ssl).
Now i want to deploy the mormot server aside the IIS. He shall listen on a different Port. I Can register a Server and i can see that an URL become registered.
We add port filter rules to the firewall so the Messages get forwarded to our Server. But we cant reach the Mormot Server external nor via our web application.
Is it possible to have IIS and Mormot listen on different Ports on the same server ? Or do we have to use another Server for mormot ?
We wrap our head around this for now 3-4 days. But we cant get it to work.
Maybe one of you can help us out here.
If further Information are needed, just request them.
Thank you all for your time.
Hello all,
i don't know if i do something wrong in the following Scenario.
I connect with a Webclient and authenticate successfull at the mormot server.
Now i can use Interface Based Services. But how to use the Connection Properties to the db the mormot way in the service?
I use the global variable of the defined Connection properties and this works well but now i get a lot of sleeping proccess in my database. They will disappear after the mormot server stops running, but they remain the whole time the server run's. If i use the procedure EndCurrentThread after each execution the Threads in the database are gone. Is this the right way to use or ?
Maybe someone of you can point me in the right direction.
If you need further Information please ask.
Thank you for all of your help
Hello Guys,
thank you for your help.
I will rethink the Process. Thank you for your information & ideads
Hello,
Sorry for reviving this old Thread, but i am wrapping my head around this for quite a while.
I have a similiar Problem here.
I want to give the user the possibility to register himself at a Webapplication written in Angular.
So i want to do the following based on your suggestion :
Ask the Server for a IV and get this. This is an easy to solve Problem.
The Client takes the IV and encrypt his credentials (as far as you stated).
But if the Client sends the Cypher to the Server, how does the Server know the IV for this specific Client ?
We have no session cause we dont called the Auth yet.
In my Opinion, sending the iv back to the Server in the Client Response breaks the Security.
How does the Server know the IV for every specific Client if they arent authenticated yet ?
Saving the IV and a ID in a Database temporarily semms wrong to or ?
How can we achieve this ?
Maybe i cant see the forest for the trees here and the solution is quite simple.
Thank you guy's for your help.
Hi ab,
Thank you for your help, i found the solution in this forum post : https://synopse.info/forum/viewtopic.php?id=3621
I defined the interval based header with the wrong parameters. And theefore mormort done what it was intended to do, it ignored the unknow ones. All fine, i just missunderstodd something.
Hi Ab,
unfortunately this change doesn't make the thing work.
Examplecode on the ServerSide
Interface
Unit interfaceService;
interface
uses
SynCommons,
mORMot;
type
ITickets = interface(IInvokable)
['{64DC19BA-673A-4D5F-B1D3-36629063563B}']
function method(const obj : RawJSON) : RawJSON;
end;
implementation
initialization
// so that we could use directly ISession instead of TypeInfo(ISession)
TInterfaceFactory.RegisterInterfaces([TypeInfo(IService)]);
end.
And the implementation in the Server
function TServiceService.method(const objbj: RawJSON): RawJSON;
begin
result := obj;
end;
And on the client side i do something like
public saveTicket(obj: any): void {
let uri: string = '';
uri = this.apiRoot + '/Tickets.saveTicket';
uri = this.authService.SessionSign(uri);
this.http.post(this.server + '/' + uri, obj).subscribe((response)=>{
console.log(response);
});
}
The uri with signature session boils down to something like http://localhost:8080/API/Service.method?session_signature=7393368f69f0c125a13c22bc
Where obj looks like
{ key:1 val1, key2:val2,key3:val3}
The Server lock the call and this params, that is why i suppose he got the data successfully, but i dont know how to access this data in the interface based method.
The result i get in my Browser is always [null].
Maybe this helps furhtermore
Hello, i have a similiar Problem, but the other way around.
I call Interface based services from an ajax client.
Now i want to POST an object to the server.
I do this with a normal HTTP Post call.
The Mormot Server logs that i called the Method and he even log the submitted data.
But i dont know how to access the data in the interface based method.
i.e.
function TService.method(obj: RawJSON): RawJSON;
begin
result:=obj;
end;
But the Result is always empty. Why i dont get the submitted Data in obj.
The call look like this :
http://localhost:8080/API/Service.method?session_signature=7393368f69f0c125a13c22bc
and the Payload :
{key1: val1, key2: val2, key3: val3,... and so on}
How can i access this payload on the mormot Server Side in the Interface based Service.
I know that you just can stringify the object and send it via URI, but since the URI is restricted in the length/size this isn't a suitable option.
Maybe you can point me in the right direction.
Greetings
Thank you ab. That was the right direction to point me. I solved my specific Issue now. Thank you
Sorry for bother you again, i can't figure out how to use the Method. On the Server Side i just call the Method with the Parameter "checkSession" and i have a Interfaced ISession with a method Session.checkSession.
Maybe it is obvious but i just dont get how to call the Method properly. I can't find a examle as well, any further help is well appreciated
Thank you, i just overread that in the docs. Really much appreciate your help!
Hello Folks,
ist there a possibility to bypass the Authentication for a specific single URI, like it is with the standard URI '/auth'. For that one you dont need a session_signature. I want to do the same for a function which just check the SessionId. And i dont want to run in a 403 Auth failed error if the session doesnt exists any longer (therefore wrong SesionSign).
Any Idea here ?
@mpv I am aware of this solution but this lack's the opportunit to react before the SessionId is no longer authenticated. For example : Dont load the Route in the Web Application because the SessionID is no longer Authenticated. This is just for enhanced User Eperienced. I think it is unsufficient just redirect the User to the login page out of nowhere.
I came with this solution :
Implement a interface Based Service on the Server Side with a Function like :
function TServiceSession.checkSession(SessionId: Cardinal): boolean;
begin
if (restServer.SessionGetUser(SessionId) <> nil) then
begin
result := True;
end
else
begin
result := False;
end;
end;
Now we can call the Service out of the Webapp like htpp://Server/Root/Session.checkSession?SessionId=SessionId&SessionSignature=SessionSignature .
An with this we can implement A RouteGuard so only Authenticated User can Activate specific Routes. This way i dont have to track the Session timeout nor i have to track a variable for the Authentication State.
Maybe this Help someone else out.
Hello all,
is there a opportunity to check if a SessionID is still logged in ?
Background :
i implemented a Typescript Client to work with Angular 4.
Now i want to check if the sessionsId of an authenticated user is still valid (logged in). I want to do this so i can implement propper RouteGuards in Angular 4.
Is there a Way to implement this with a service so i can check it like http(s)://Server/ROOT/checkSessionId?SessionId=Session_Id&Session_signature=session_signature ?
Any help would be much appreciated.
Hello Guy's,
just in Case somone wants to know the Solution,
you both forgott the session_signature parameter at the url.
it have to look like this http://localhost/root/auth?Username=username&Session=SessionID&session_signature=session_signature
where the session_signature is computed from the uri (e.g. root/auth?Username=username&Session=SessionID)
hope this helps anyone who read this
Thank you all for your help.
The error was much much easier than the crc - Function and so on.
I just missused the Session Sign Function. I set the whole url and not just root + params.
Instead of : 'http//:xxxxxxxx/ServerRoot/Service'+Params
You have to set 'ServerRoot/Service'+params
as URL for the SessionSign Function.
Just in case somone got stuck on the same Problem.
Sorry for wasting your time.
Hi again. I worked on the server side debug.
First the mormot Log to conolse prints out something like "Invalid Signature expected xxxxxx got yyyyy "
And on the server it comes down to mormot.pas line 51804
if HexDisplayToCardinal(PTimeStamp+8,aSignature) and
(aSignature=aExpectedSignature) then
Obviously the Expected Signature and the aSignature doesnt match. But i cant find out why...
I would be glad if someone can help here
Hi ab, thank you again for your help.
I lack the experience to see that the signature is wrong by just looking at it
Thats how i compute the signature.
public SessionSign(url: string): string {
var Tix: number;
var Nonce: string;
var s: any;
var ss: any;
var d: Date = new Date();
Tix = d.getTime();
if (this.LastSessionTickCount == Tix) {
Tix = Tix + 1;
}
this.LastSessionTickCount = Tix;
Nonce = Tix.toString(16);
while (Nonce.length < 8) {
Nonce = '0' + Nonce;
}
if (Nonce.length > 8) {
Nonce = Nonce.slice(Nonce.length - 8, Nonce.length);
}
ss = this.crc32(url, this.crc32(Nonce, this.SessionPrivateKey)).toString(16);
while (ss.length < 8) {
ss = '0' + ss;
}
s = url.indexOf("?") == -1 ? url + '?session_signature=' : url + '&session_signature=';
return s + this.SessionIDHexa8 + Nonce + ss;
}
Where SessionIdJHexa8 and SessionPrivateKey are
private gotSession(aSessionKey: string) {
var i: number = aSessionKey.indexOf("+");
this.SessionID = parseInt(aSessionKey.slice(0, i));
this.SessionIDHexa8 = this.SessionID.toString(16);
while (this.SessionIDHexa8.length < 8) {
this.SessionIDHexa8 = '0' + this.SessionIDHexa8;
}
this.SessionPrivateKey = this.crc32(this.PasswordHashHexa, this.crc32(aSessionKey, 0));
};
@ab
Thank you for your help. I call the AuthenticationRegister now before i call CreateMissingTables. But i still get 403 Forbidden from the Webapplication but all work as expected wiht the mormot Client.
I can login successfully and get a Session but i cant get the signature to work or whatever goes wrong there.
after login
{"result":"1169656096+29EBAE633FDCDA4F25C690589C8CE3863A46063CBDBE9D969C790FA9EF93B64F","logonid":4,"logonname":"***********","logondisplay":"","logongroup":3,"timeout":60,"server":"Server","version":""}
And now after call a service
Response with status: 403 Forbidden for URL: http://localhost:8080/API/Hello.Hello?session_signature=45b789200450f02caf6a4349
{
"errorCode":403,
"errorText":"Authentication Failed: Invalid signature (0)"
}
I hope u can help me further.
Thank you
You disabled authentication on the server side.
So it is logical to be able to create sessions without any authentication...
Where i disabled the Authentication, i thought the Default Authentication is the Safe Authentication mode ???
I don't now why this should be an issue at all.
This is all i do on the server side
restModel := TSQLModel.Create([], ROOT_NAME);
try
// initialize Rest-Server
restServer := TSQLRestServerFullMemory.Create(restModel,false);
restServer.CreateMissingTables(0, [itoNoAutoCreateUsers]);
restServer.AuthenticationRegister(TSQLRestServerAuthenticationDefault).Options := [];
fillAuthFromDB(restServer, dbConProbs);
try
// register the Services on the Server
restServer.ServiceDefine(TServiceHello, [IHello], sicPerSession);
// launch HttpServer which publish the restServer
// useHttpApiRegisteringURI = AutoRegistering the URI specified by the restServer + PORT_NAME
httpServer := TSQLHttpServer.Create(PORT_NAME, [restServer], '+', useHttpApiRegisteringURI);
try
httpServer.AccessControlAllowOrigin := '*';
writeln(#10'Background server is running.'#10);
writeln('Press [Enter] to close the server.'#10);
readln;
finally
httpServer.Free;
end;
finally
restServer.Free;
end;
finally
restModel.Free;
end;
And the implementation of the services + Add the Users from my db to the sqlite tables to use the mormot framework auth of course.
And the session signature works as expected with a mormot client. There i can use the services after login, That's why i assume something is wrong in my javascript code
Hello Guys, i followed the code from RangerX and esmondb to implement the Authentication in typescript (for angular 4).
The login works as expected, and i get a signature, but i fail at the Session signature, the Server always answer wtih 403 : Forbidden
Code for the Authentication
public login(username, password): void {
this.Username = username;
this.PasswordHashHexa = sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash("salt" + password)); //Password Hex Sha256 generate
this.http.get('http://localhost:8080/' + this.ServerAuthRoot + '/auth?UserName=' + username).map(this.extractData).catch(this.handleErrorObservable).subscribe(
response => {// We got a Nonce from the Server in response.result
this.gotNonce(response.result);
},
error => {// Some Error occured, we did not got a Nonce from the Server
alert(JSON.stringify(error));
}
);
}
private gotNonce(aNonce: string): void {
var shaPass: string;
var aClientNonce = "", s = "", d = new Date();
aClientNonce = d.getFullYear().toString();
s = d.getMonth().toString();
if (s.length === 1) {
s = '0' + s;
}
aClientNonce = aClientNonce + '-' + s;
s = d.getDate().toString();
if (s.length === 1) {
s = '0' + s;
}
aClientNonce = aClientNonce + '-' + s + ' ';
s = d.getHours().toString();
if (s.length === 1) {
s = '0' + s;
}
aClientNonce = aClientNonce + s;
s = d.getMinutes().toString();
if (s.length === 1) {
s = '0' + s;
}
aClientNonce = aClientNonce + ':' + s;
s = d.getSeconds().toString();
if (s.length === 1) {
s = '0' + s;
}
aClientNonce = aClientNonce + ':' + s;
aClientNonce = sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash(aClientNonce))
shaPass = sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash(this.ServerAuthRoot + aNonce + aClientNonce + this.Username + this.PasswordHashHexa));
s = 'http://localhost:8080/' + this.ServerAuthRoot + '/auth?UserName=' + this.Username + '&Password=' + shaPass + '&ClientNonce=' + aClientNonce;
// prompt('Resulting Call :', s);
this.http.get(s).map(this.extractData).catch(this.handleErrorObservable).subscribe(
response => {
alert(JSON.stringify(response));
this.gotSession(response.result);
},
error => {
alert(JSON.stringify(error));
}
)
}
private gotSession(aSessionKey: string) {
var i: number = aSessionKey.indexOf("+");
this.SessionID = parseInt(aSessionKey.slice(0, i));
this.SessionIDHexa8 = this.SessionID.toString(16);
while (this.SessionIDHexa8.length < 8) {
this.SessionIDHexa8 = '0' + this.SessionIDHexa8;
}
this.SessionPrivateKey = this.crc32(this.PasswordHashHexa, this.crc32(aSessionKey, 0));
};
and the Session Signature
public SessionSign(url: string): string {
var Tix: number;
var Nonce: string;
var s: any;
var ss: any;
var d: Date = new Date();
Tix = d.getTime();
if (this.LastSessionTickCount == Tix) {
Tix = Tix + 1;
}
this.LastSessionTickCount = Tix;
Nonce = Tix.toString(16);
while (Nonce.length < 8) {
Nonce = '0' + Nonce;
}
if (Nonce.length > 8) {
Nonce = Nonce.slice(Nonce.length - 8, Nonce.length);
}
ss = this.crc32(url, this.crc32(Nonce, this.SessionPrivateKey)).toString(16);
while (ss.length < 8) {
ss = '0' + ss;
}
s = url.indexOf("?") == -1 ? url + '?session_signature=' : url + '&session_signature=';
return s + this.SessionIDHexa8 + Nonce + ss;
}
and the crc32 function
private Crc32Tab = [ /* CRC polynomial 0xEDB88320 */
0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,
0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91,
0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,
0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,
0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,
0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,
0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,
0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D,
0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433,
0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x086D3D2D,0x91646C97,0xE6635C01,
0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,
0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,
0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,
0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,
0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,
0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD,
0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683,
0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,
0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,
0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,
0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,
0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79,
0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F,
0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,
0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,
0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,
0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,
0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45,
0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,
0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9,
0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF,
0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D];
private Crc32Add(crc,c)
/*
'crc' should be initialized to 0xFFFFFFFF and after the computation it should be
complemented (inverted).
CRC-32 is also known as FCS-32.
If the FCS-32 is calculated over the data and over the complemented FCS-32, the
result will always be 0xDEBB20E3 (without the complementation).
*/
{
return this.Crc32Tab[(crc^c)&0xFF]^((crc>>8)&0xFFFFFF);
}
private crc32(str, crc)
{
var n, len;
len = str.length;
//var crc;
if (typeof(crc) == "undefined") { crc = 0xFFFFFFFF; }
else {
crc = crc^0xFFFFFFFF; //crc = ~crc;
if (crc < 0) {
crc = 4294967296 + crc;
}
}
//crc=0xFFFFFFFF;
for (n=0; n<len; n = n+1) {
crc = this.Crc32Add(crc,str.charCodeAt(n));
}
crc = crc^0xFFFFFFFF; //crc = ~crc;
if (crc < 0) {
crc = 4294967296 + crc;
}
return crc;//^0xFFFFFFFF;
}
}
I don't know why the Session Signature doesnt work as expected.
I hope you guy's can help me out.
Edit : And Sorry for reviving an old Post
Hello again,
There had to be an error in my system, i don't know which. I just build me a fresh setup an anything works fine.
Thank you all for your patience and help.
Can be Closed
Hello again, like i said i missunderstood your question.
Thank you for your patience.
The Target Platform is Win32.
On which platform are you trying to compile it?
I'm not able to reproduce the issue with Win32 or Win64 using Delphi XE6.
It is the same Platform, it gets compiled on this machine and it stays there for test reasons. We are in the process to decide if we use mORMot or some other Frameworks for our upcoming Application.
So Win64.
And for further Clarification, i try to run the TestSql3 project shipped with mORMot.
But Maybe i am only misunderstanding your question^^
Delphi XE5 on a Windos 8 64 Bit Machine
Hello,
the platform ist Windows 8.1 Pro 64 Bit
Hello again,
i removed all mORMot Versions from my System and downloaded a new fresh Version of the NightlyBuild.zip . I get the Same error now in line 29580 but i get further errors,
like undeclared identifier RawUTF8. I set all the needed Lib and search paths like it is documented.
Ty for your fast Reaction.
I will check this and let you know if this solved my Problem.
Hello,
i downloaded the current Nightly Build.
I followed the Instructions to install mORMot.
But i can't compile the TestSQL3.
I' am working on Rad Studio XE5.
The Compilation error Stops at line 30642 in mormot.pas : "with Deref(CT^.ParentInfo)^ do"
The Error Log say that an inline function cant use the local symbol "Deref"
Maybe Someone of you eperienced an similiar issue and can help me out.
Pages: 1