public sealed class Policy : IMessage<Policy>, IEquatable<Policy>, IDeepCloneable<Policy>, IBufferMessage, IMessage
Reference documentation and code samples for the Google Cloud Identity and Access Management (IAM) v1 API class Policy.
An Identity and Access Management (IAM) policy, which specifies access
controls for Google Cloud resources.
A Policy is a collection of bindings. A binding binds one or more
members, or principals, to a single role. Principals can be user
accounts, service accounts, Google groups, and domains (such as G Suite). A
role is a named list of permissions; each role can be an IAM predefined
role or a user-created custom role.
For some types of Google Cloud resources, a binding can also specify a
condition, which is a logical expression that allows access to a resource
only if the expression evaluates to true. A condition can add constraints
based on attributes of the request, the resource, or both. To learn which
resources support conditions in their IAM policies, see the
IAM
documentation.
Associates a list of members, or principals, with a role. Optionally,
may specify a condition that determines how and when the bindings are
applied. Each of the bindings must contain at least one principal.
The bindings in a Policy can refer to up to 1,500 principals; up to 250
of these principals can be Google groups. Each occurrence of a principal
counts towards these limits. For example, if the bindings grant 50
different roles to user:alice@example.com, and not to any other
principal, then you can add another 1,450 principals to the bindings in
the Policy.
etag is used for optimistic concurrency control as a way to help
prevent simultaneous updates of a policy from overwriting each other.
It is strongly suggested that systems make use of the etag in the
read-modify-write cycle to perform policy updates in order to avoid race
conditions: An etag is returned in the response to getIamPolicy, and
systems are expected to put that etag in the request to setIamPolicy to
ensure that their change will be applied to the same version of the policy.
Important: If you use IAM Conditions, you must include the etag field
whenever you call setIamPolicy. If you omit this field, then IAM allows
you to overwrite a version 3 policy with a version 1 policy, and all of
the conditions in the version 3 policy are lost.
Valid values are 0, 1, and 3. Requests that specify an invalid value
are rejected.
Any operation that affects conditional role bindings must specify version
3. This requirement applies to the following operations:
Getting a policy that includes a conditional role binding
Adding a conditional role binding to a policy
Changing a conditional role binding in a policy
Removing any role binding, with or without a condition, from a policy
that includes conditions
Important: If you use IAM Conditions, you must include the etag field
whenever you call setIamPolicy. If you omit this field, then IAM allows
you to overwrite a version 3 policy with a version 1 policy, and all of
the conditions in the version 3 policy are lost.
If a policy does not include any conditions, operations on that policy may
specify any valid version or leave the field unset.
To learn which resources support conditions in their IAM policies, see the
IAM
documentation.
public bool AddRoleMember(string role, string member)
Adds the specified member to the specified role. If the role does
not already exist, it is created.
This method will fail with an InvalidOperationException
if it is called on a Policy with a Version greater than 1,
or if any of the bindings contain conditions,
as that indicates a more complicated policy than this method is prepared
to handle. Changes to such policies must be made manually.
public bool RemoveRoleMember(string role, string member)
Removes the specified member to the specified role, if they belong to it. If the role becomes empty after
removing the member, it is removed from the policy.
This method will fail with an InvalidOperationException
if it is called on a Policy with a Version greater than 1,
or if any of the bindings contain conditions,
as that indicates a more complicated policy than this method is prepared
to handle. Changes to such policies must be made manually.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-07 UTC."],[[["\u003cp\u003eThe \u003ccode\u003ePolicy\u003c/code\u003e class in the Google Cloud IAM v1 API manages access controls for Google Cloud resources by associating members with roles, optionally including conditions for access.\u003c/p\u003e\n"],["\u003cp\u003eA \u003ccode\u003ePolicy\u003c/code\u003e consists of \u003ccode\u003ebindings\u003c/code\u003e, each of which links one or more members (principals like users or service accounts) to a single role, with the ability to specify a condition that must be met for the binding to be applied.\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003ePolicy\u003c/code\u003e class utilizes an \u003ccode\u003eetag\u003c/code\u003e for optimistic concurrency control, preventing simultaneous updates from overwriting each other, and is crucial to use when IAM Conditions are included.\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003eVersion\u003c/code\u003e property of a \u003ccode\u003ePolicy\u003c/code\u003e determines the policy's format, where version \u003ccode\u003e3\u003c/code\u003e is required for any conditional role bindings, and omitting the \u003ccode\u003eetag\u003c/code\u003e can lead to data loss in policies with version \u003ccode\u003e3\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eMethods like \u003ccode\u003eAddRoleMember\u003c/code\u003e and \u003ccode\u003eRemoveRoleMember\u003c/code\u003e simplify policy modification, but are limited to policies with a \u003ccode\u003eVersion\u003c/code\u003e of 1 or less and without conditions.\u003c/p\u003e\n"]]],[],null,["# Google Cloud Identity and Access Management (IAM) v1 API - Class Policy (3.4.0)\n\nVersion latestkeyboard_arrow_down\n\n- [3.4.0 (latest)](/dotnet/docs/reference/Google.Cloud.Iam.V1/latest/Google.Cloud.Iam.V1.Policy)\n- [3.3.0](/dotnet/docs/reference/Google.Cloud.Iam.V1/3.3.0/Google.Cloud.Iam.V1.Policy)\n- [3.2.0](/dotnet/docs/reference/Google.Cloud.Iam.V1/3.2.0/Google.Cloud.Iam.V1.Policy)\n- [3.1.0](/dotnet/docs/reference/Google.Cloud.Iam.V1/3.1.0/Google.Cloud.Iam.V1.Policy)\n- [3.0.0](/dotnet/docs/reference/Google.Cloud.Iam.V1/3.0.0/Google.Cloud.Iam.V1.Policy)\n- [2.4.0](/dotnet/docs/reference/Google.Cloud.Iam.V1/2.4.0/Google.Cloud.Iam.V1.Policy)\n- [2.3.0](/dotnet/docs/reference/Google.Cloud.Iam.V1/2.3.0/Google.Cloud.Iam.V1.Policy)\n- [2.2.0](/dotnet/docs/reference/Google.Cloud.Iam.V1/2.2.0/Google.Cloud.Iam.V1.Policy) \n\n public sealed class Policy : IMessage\u003cPolicy\u003e, IEquatable\u003cPolicy\u003e, IDeepCloneable\u003cPolicy\u003e, IBufferMessage, IMessage\n\nReference documentation and code samples for the Google Cloud Identity and Access Management (IAM) v1 API class Policy.\n\nAn Identity and Access Management (IAM) policy, which specifies access\ncontrols for Google Cloud resources.\n\nA `Policy` is a collection of `bindings`. A `binding` binds one or more\n`members`, or principals, to a single `role`. Principals can be user\naccounts, service accounts, Google groups, and domains (such as G Suite). A\n`role` is a named list of permissions; each `role` can be an IAM predefined\nrole or a user-created custom role.\n\nFor some types of Google Cloud resources, a `binding` can also specify a\n`condition`, which is a logical expression that allows access to a resource\nonly if the expression evaluates to `true`. A condition can add constraints\nbased on attributes of the request, the resource, or both. To learn which\nresources support conditions in their IAM policies, see the\n[IAM\ndocumentation](https://cloud.google.com/iam/help/conditions/resource-policies).\n\n**JSON example:** \n\n {\n \"bindings\": [\n {\n \"role\": \"roles/resourcemanager.organizationAdmin\",\n \"members\": [\n \"user:mike@example.com\",\n \"group:admins@example.com\",\n \"domain:google.com\",\n \"serviceAccount:my-project-id@appspot.gserviceaccount.com\"\n ]\n },\n {\n \"role\": \"roles/resourcemanager.organizationViewer\",\n \"members\": [\n \"user:eve@example.com\"\n ],\n \"condition\": {\n \"title\": \"expirable access\",\n \"description\": \"Does not grant access after Sep 2020\",\n \"expression\": \"request.time \u003c\n timestamp('2020-10-01T00:00:00.000Z')\",\n }\n }\n ],\n \"etag\": \"BwWWja0YfJA=\",\n \"version\": 3\n }\n\n**YAML example:** \n\n bindings:\n - members:\n - user:mike@example.com\n - group:admins@example.com\n - domain:google.com\n - serviceAccount:my-project-id@appspot.gserviceaccount.com\n role: roles/resourcemanager.organizationAdmin\n - members:\n - user:eve@example.com\n role: roles/resourcemanager.organizationViewer\n condition:\n title: expirable access\n description: Does not grant access after Sep 2020\n expression: request.time \u003c timestamp('2020-10-01T00:00:00.000Z')\n etag: BwWWja0YfJA=\n version: 3\n\nFor a description of IAM and its features, see the\n[IAM documentation](https://cloud.google.com/iam/docs/). \n\nInheritance\n-----------\n\n[object](https://learn.microsoft.com/dotnet/api/system.object) \\\u003e Policy \n\nImplements\n----------\n\n[IMessage](https://cloud.google.com/dotnet/docs/reference/Google.Protobuf/latest/Google.Protobuf.IMessage-1.html)[Policy](/dotnet/docs/reference/Google.Cloud.Iam.V1/latest/Google.Cloud.Iam.V1.Policy), [IEquatable](https://learn.microsoft.com/dotnet/api/system.iequatable-1)[Policy](/dotnet/docs/reference/Google.Cloud.Iam.V1/latest/Google.Cloud.Iam.V1.Policy), [IDeepCloneable](https://cloud.google.com/dotnet/docs/reference/Google.Protobuf/latest/Google.Protobuf.IDeepCloneable-1.html)[Policy](/dotnet/docs/reference/Google.Cloud.Iam.V1/latest/Google.Cloud.Iam.V1.Policy), [IBufferMessage](https://cloud.google.com/dotnet/docs/reference/Google.Protobuf/latest/Google.Protobuf.IBufferMessage.html), [IMessage](https://cloud.google.com/dotnet/docs/reference/Google.Protobuf/latest/Google.Protobuf.IMessage.html) \n\nInherited Members\n-----------------\n\n[object.GetHashCode()](https://learn.microsoft.com/dotnet/api/system.object.gethashcode) \n[object.GetType()](https://learn.microsoft.com/dotnet/api/system.object.gettype) \n[object.ToString()](https://learn.microsoft.com/dotnet/api/system.object.tostring)\n\nNamespace\n---------\n\n[Google.Cloud.Iam.V1](/dotnet/docs/reference/Google.Cloud.Iam.V1/latest/Google.Cloud.Iam.V1)\n\nAssembly\n--------\n\nGoogle.Cloud.Iam.V1.dll\n\nConstructors\n------------\n\n### Policy()\n\n public Policy()\n\n### Policy(Policy)\n\n public Policy(Policy other)\n\nProperties\n----------\n\n### AuditConfigs\n\n public RepeatedField\u003cAuditConfig\u003e AuditConfigs { get; }\n\nSpecifies cloud audit logging configuration for this policy.\n\n### Bindings\n\n public RepeatedField\u003cBinding\u003e Bindings { get; }\n\nAssociates a list of `members`, or principals, with a `role`. Optionally,\nmay specify a `condition` that determines how and when the `bindings` are\napplied. Each of the `bindings` must contain at least one principal.\n\nThe `bindings` in a `Policy` can refer to up to 1,500 principals; up to 250\nof these principals can be Google groups. Each occurrence of a principal\ncounts towards these limits. For example, if the `bindings` grant 50\ndifferent roles to `user:alice@example.com`, and not to any other\nprincipal, then you can add another 1,450 principals to the `bindings` in\nthe `Policy`.\n\n### Etag\n\n public ByteString Etag { get; set; }\n\n`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\n**Important:** If you use IAM Conditions, you must include the `etag` field\nwhenever you call `setIamPolicy`. If you omit this field, then IAM allows\nyou to overwrite a version `3` policy with a version `1` policy, and all of\nthe conditions in the version `3` policy are lost.\n\n### Version\n\n public int Version { get; set; }\n\nSpecifies the format of the policy.\n\nValid values are `0`, `1`, and `3`. Requests that specify an invalid value\nare rejected.\n\nAny operation that affects conditional role bindings must specify version\n`3`. This requirement applies to the following operations:\n\n- Getting a policy that includes a conditional role binding\n- Adding a conditional role binding to a policy\n- Changing a conditional role binding in a policy\n- Removing any role binding, with or without a condition, from a policy that includes conditions\n\n**Important:** If you use IAM Conditions, you must include the `etag` field\nwhenever you call `setIamPolicy`. If you omit this field, then IAM allows\nyou to overwrite a version `3` policy with a version `1` policy, and all of\nthe conditions in the version `3` policy are lost.\n\nIf a policy does not include any conditions, operations on that policy may\nspecify any valid version or leave the field unset.\n\nTo learn which resources support conditions in their IAM policies, see the\n[IAM\ndocumentation](https://cloud.google.com/iam/help/conditions/resource-policies).\n\nMethods\n-------\n\n### AddRoleMember(string, string)\n\n public bool AddRoleMember(string role, string member)\n\nAdds the specified member to the specified role. If the role does\nnot already exist, it is created.\nThis method will fail with an [InvalidOperationException](https://learn.microsoft.com/dotnet/api/system.invalidoperationexception)\nif it is called on a Policy with a [Version](/dotnet/docs/reference/Google.Cloud.Iam.V1/latest/Google.Cloud.Iam.V1.Policy#Google_Cloud_Iam_V1_Policy_Version) greater than 1,\nor if any of the bindings contain conditions,\nas that indicates a more complicated policy than this method is prepared\nto handle. Changes to such policies must be made manually.\n\n### RemoveRoleMember(string, string)\n\n public bool RemoveRoleMember(string role, string member)\n\nRemoves the specified member to the specified role, if they belong to it. If the role becomes empty after\nremoving the member, it is removed from the policy.\nThis method will fail with an [InvalidOperationException](https://learn.microsoft.com/dotnet/api/system.invalidoperationexception)\nif it is called on a Policy with a [Version](/dotnet/docs/reference/Google.Cloud.Iam.V1/latest/Google.Cloud.Iam.V1.Policy#Google_Cloud_Iam_V1_Policy_Version) greater than 1,\nor if any of the bindings contain conditions,\nas that indicates a more complicated policy than this method is prepared\nto handle. Changes to such policies must be made manually."]]