Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
Delphi 7 Professional
|
MS AuthZ Technologie AuthZAccessCheck Problem.
2. Jan 2008, 15:32
AuthZ ist eine MS Technologie, mit der man unter anderem ein AccessCheck machen kann, ohne ein Token verwenden zu müssen. "AuthZAccessCheck" kann eine Sid verwenden, um Zugriff zu testen.
Das folgende Programm und alle Units kann man auch hier laden:
jedi-apilib-rev136.zip.
Dieses Programm demonstriert MS AuthZ mit JWSCL.
Delphi-Quellcode:
program AuthCtx2;
{$APPTYPE CONSOLE}
uses
dialogs,
JwaWindows,
jwsclConstants,
jwsclTypes,
JwsclMapping,
JwsclSid,
JwsclToken,
JwsclResource,
JwsclDescriptor,
JwsclACL,
JwsclUtils,
JwsclSecureObjects,
JwsclKnownSid,
JwsclAuthCtx;
const
GUID_1: TGUID = (D1: 1; D2: 2; D3: 1; D4: (1, 2, 3, 4, 5, 6, 7, 8));
GUID_2: TGUID = (D1: 1; D2: 2; D3: 1; D4: (1, 34, 3, 4, 5, 6, 7, 8));
var
RMCtx : TJwAuthResourceManager;
AuthZCtx : TJwAuthContext;
Reply: TJwAuthZAccessReply;
AuthZHandle: TAuthZAccessCheckResultHandle;
Request: TJwAuthZAccessRequest;
SD : TJwSecurityDescriptor;
SDArray : TJwSecurityDescriptorArray;
ObjectTypeArray: TJwObjectTypeArray;
i : Integer;
begin
JwInitWellKnownSIDs;
RMCtx := TJwAuthResourceManager.Create('',
[authRM_NoAudit],nil,nil,nil);
AuthZCtx := TJwAuthContext.CreateBySid(
RMCtx,//const ResourceManager: TJwAuthResourceManager;
[authZSF_Default],//const Flags : TAuthZSidContextFlags;
JwAdministratorsSID,//
0,//const ExpirationTime: Int64;
nil//const DynamicGroupArgs: Pointer
);
SD := TJwSecurityDescriptor.Create; //CreateDefaultByToken();
SD.Owner := JwNullSID;
SD.PrimaryGroup := JwNullSID;
SD.DACL.Clear;
SD.DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(
nil,[], FILE_READ_EA, JwAdministratorsSID, false));
{SD.DACL.Add(TJwDiscretionaryAccessControlEntryDeny.Create(
nil,[], FILE_READ_DATA, JwAdministratorsSID, false));
}
SetLength(SDArray,2);
SDArray[0] := TJwSecurityDescriptor.CreateDefaultByToken();
SDArray[0].DACL.Clear;
SDArray[0].DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(
nil,[], FILE_READ_ATTRIBUTES, JwAdministratorsSID, false));
SDArray[1] := TJwSecurityDescriptor.CreateDefaultByToken();
SDArray[1].DACL.Clear;
SDArray[1].DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(
nil,[], FILE_WRITE_DATA, JwAdministratorsSID, false));
SetLength(ObjectTypeArray, 2);
ZeroMemory(@ObjectTypeArray[0], sizeof(ObjectTypeArray[0]));
ObjectTypeArray[0].Level := ACCESS_OBJECT_GUID;
ObjectTypeArray[0].ObjectType := @GUID_1;
ZeroMemory(@ObjectTypeArray[1], sizeof(ObjectTypeArray[1]));
ObjectTypeArray[1].Level := ACCESS_OBJECT_GUID;
ObjectTypeArray[1].ObjectType := @GUID_2;
Request := TJwAuthZAccessRequest.Create(
MAXIMUM_ALLOWED,//FILE_READ_EA,//DesiredAccess: TJwAccessMask;
JwNullSID, //PrincipalSelfSid: TJwSecurityID;
ObjectTypeArray,//ObjectTypeArray,//ObjectTypeArray: TJwObjectTypeArray;
nil,//Data: Pointer
shOwned
);
AuthZCtx.AccessCheck(
1,//Flags: Cardinal;
Request,//const Request: TJwAuthZAccessRequest;
0,//const AuditInfo: TAuthZAuditInfoHandle;
SD,//const SecurityDescriptor: TJwSecurityDescriptor;
SDArray,//const OptionalSecurityDescriptorArray: TJwSecurityDescriptorArray;
Reply,//out Reply: TJwAuthZAccessReply;
AuthZHandle//out AuthZHandle: TAuthZAccessCheckResultHandle
);
writeln(JwFormatAccessRights(Reply.GrantedAccessMask[0], FileMapping));
Reply.Free;
//readln;
AuthZCtx.Free;
RMCtx.Free;
end.
Was ist das Problem?
1. SDArray ist ein Array von Sicherheitsdeskriptoren, die einfach ein SD sind, jedoch hintereinandergeschrieben. Die DACL wird also zu einer riesigen DACL verschmolzen. Die Reihenfolge ist logisch, also 1,2,3,4... (zuerst der erste, dann der zweite, usf.)
Das Problem ist, dass nur der erste SD in SDArray gehör findet. Das Recht "FILE_WRITE_DATA" müsste in der Ausgabe von JwFormatAccessRights auch vorkommen.
2.
AuthZCtx.AccessCheck hat als Eingabe eine Klasse "Request", welche eine Reihe von Objekteigenschaften entgegen nehmen kann. Das sind Eigenschaften eines Objektes, welche auch gesichert werden wollen. Z.b. ist eine (fiktive) Eigenschaft "Visible", welche nur von Administratoren verändert werden kann, aber sonst jeder lesen darf.
Gebe ich diesen Array an, wirft AuthZAccessCheck jedesmal einen Fehler.
Delphi-Quellcode:
Request := TJwAuthZAccessRequest.Create(
MAXIMUM_ALLOWED,//FILE_READ_EA,//DesiredAccess: TJwAccessMask;
JwNullSID, //PrincipalSelfSid: TJwSecurityID;
ObjectTypeArray, //<--- wichtig!!
nil,//Data: Pointer
shOwned
);
Vorsicht, das Beispiel im Download funktioniert nur, weil es nil statt ObjectTypeArray an den Konstruktor übergibt. Das Beispiel hier bringt jedoch den Fehler.
Alles klar?
|