2013-04-16 10 views
5

Pracuję nad wtyczką MS CRM i powinienem być w stanie określić, czy bieżący użytkownik ma prawo zapisu do bieżącego obiektu. Nie wiem, jak podejść do tego zadania.Jak uzyskać bieżące uprawnienia użytkownika w MS Dynamics CRM po stronie serwera

Wygląda na to, że najbardziej przyjazny dla użytkownika sposób realizacji tego zadania to obecnie unsupported.

Czy jest jakaś alternatywa w SDK MS CRM 2011, z wyjątkiem komponowania zapytania FetchXML i analizowania jego danych wyjściowych?

Odpowiedz

9

Oto co mam wymyślić - Kod ten będzie sprawdzić, czy bieżący użytkownik wydał przywilej na bieżącym rekordzie:

// Requesting user's access rights to current record 
var principalAccessRequest = new RetrievePrincipalAccessRequest 
{ 
    Principal = new EntityReference("systemuser", localContext.PluginExecutionContext.UserId), 
    Target = new EntityReference(localContext.PluginExecutionContext.PrimaryEntityName, localContext.PluginExecutionContext.PrimaryEntityId) 
}; 

// Response will contain AccessRights mask, like AccessRights.WriteAccess | AccessRights.ReadAccess | ... 
var principalAccessResponse = (RetrievePrincipalAccessResponse)localContext.OrganizationService.Execute(principalAccessRequest); 

if ((principalAccessResponse.AccessRights & AccessRights.WriteAccess) != AccessRights.None) 
{ 
    ... 
    ... 
    ... 
} 

Kod wewnątrz if oświadczenie zostanie wykonane, jeśli użytkownik ma WriteAccess do bieżącego rekordu .

-1

Sprawdź, czy this jest niedostępny.

Istotą jej jest:

//Check if user is connected for on-prem or hosted 

Guid userGuid; 
if(Request.LogonUserIdentity.IsAuthenticated == true) 
{ 
    WhoAmIRequest userRequest = new Microsoft.Crm.SdkTypeProxy.WhoAmIRequest(); 
    WhoAmIResponse user = (Microsoft.Crm.SdkTypeProxy.WhoAmIResponse)objCrmService.Execute (userRequest); 
    userGuid = user.UserId; 
} 
else //ifd 
{ 
    userGuid = new Guid(Context.User.Identity.Name); 
} 
+3

Powoduje to wyświetlenie podstawowych informacji o użytkowniku, a nie ich uprawnień. – Daryl

+0

Dobra rada @Daryl – Bvrce

1

Według Matta odpowiedź:

  1. Retrieve na przywileju jednostki
  2. Dołącz na podmiot roleprivilege gdzie privilege.privilegeid = roleprivilege.privilegeid
  3. Dołącz do encji podmiotserol, gdzie katalogserrole.roleid = roleprivileges.roleid i systemuserrole.systemuserid = (GUID danego użytkownika)
  4. wówczas iterację przywilejów lub szukać przywileju gdzie privilege.name = „prvReadMyEntityName”

Właśnie trzeba wykonać przyłącza i dodać klauzula where, na której Ci zależy. Oto Odpowiednik SQL:

SELECT Privilege.* 
FROM Privilege 
INNER JOIN RolePrivilege ON Privilege.PrivilegeId = RolePrivilege.PrivilegeId 
INNER JOIN SystemUserRole ON SystemUserRole.RoleId = RolePrivileges.RoleId AND SystemUserRole.SystemUserId = (user's GUID) 
-- WHERE Add whatever constraints on the Privilege entity that you need 

Można wykonać to za pomocą Fetch XML lub LINQ do CRM lub zgłaszanie zapytań lub nawet OData.

+0

Znalazłem bardziej elegancki sposób: http://stackoverflow.com/a/16042098/1047741 – shytikov

Powiązane problemy