1
00:00:00,040 --> 00:00:03,279
Welcome to the M365 FM podcast,
where we explore the people,

2
00:00:03,279 --> 00:00:06,200
ideas and technologies shaping
the future of work.

3
00:00:06,200 --> 00:00:09,720
The checkpoint every app has to
pass one graph.

4
00:00:09,720 --> 00:00:12,199
Permission can hand an app every
mailbox in your company.

5
00:00:12,199 --> 00:00:13,519
Most people never notice that

6
00:00:13,519 --> 00:00:14,919
line until a security review

7
00:00:14,919 --> 00:00:16,280
points at it because the

8
00:00:16,280 --> 00:00:17,679
permission sits quietly inside

9
00:00:17,679 --> 00:00:19,239
an app somebody set up months

10
00:00:19,239 --> 00:00:19,879
ago.

11
00:00:19,879 --> 00:00:21,120
Microsoft Graph is the single

12
00:00:21,120 --> 00:00:22,379
doorway apps used to reach your

13
00:00:22,379 --> 00:00:23,920
mail, your files, your teams

14
00:00:23,920 --> 00:00:25,440
messages, and the people in your

15
00:00:25,440 --> 00:00:26,039
directory.

16
00:00:26,039 --> 00:00:28,559
And it won't open for anything
that wasn't granted permission.

17
00:00:28,559 --> 00:00:32,219
First, an app can ask in two
ways acting as a signed in

18
00:00:32,219 --> 00:00:35,280
person or acting as itself with
nobody in the room.

19
00:00:35,280 --> 00:00:38,640
And that choice decides whether
it touches one person's data or

20
00:00:38,640 --> 00:00:40,280
the whole organization.

21
00:00:40,280 --> 00:00:43,000
Most graph projects don't fall
apart because of code, and when

22
00:00:43,000 --> 00:00:45,679
they do fall apart, it's usually
at consent because somebody

23
00:00:45,679 --> 00:00:47,759
asked for far more access than
the job needed.

24
00:00:47,759 --> 00:00:48,880
By the end of this, you'll be

25
00:00:48,880 --> 00:00:50,399
able to read any permission name

26
00:00:50,399 --> 00:00:51,840
and know exactly what it lets an

27
00:00:51,840 --> 00:00:52,600
app do.

28
00:00:52,600 --> 00:00:54,320
What a graph permission actually
is.

29
00:00:54,320 --> 00:00:56,880
Microsoft Graph is one doorway
into almost everything your

30
00:00:56,880 --> 00:00:58,479
organization keeps in the cloud.

31
00:00:58,479 --> 00:00:59,640
Mail sits behind it.

32
00:00:59,640 --> 00:01:01,090
So do files and folders.

33
00:01:01,090 --> 00:01:02,570
So do teams conversations.

34
00:01:02,570 --> 00:01:03,810
And so does the directory that

35
00:01:03,810 --> 00:01:05,170
lists every account your company

36
00:01:05,170 --> 00:01:05,890
manages.

37
00:01:05,890 --> 00:01:08,769
Rather than learning a separate
door for each service, an app

38
00:01:08,769 --> 00:01:11,890
learns this one and asks for the
specific things it needs.

39
00:01:11,890 --> 00:01:13,129
A permission is the privilege an

40
00:01:13,129 --> 00:01:14,250
app has been granted before

41
00:01:14,250 --> 00:01:15,769
graph hands over anything at

42
00:01:15,769 --> 00:01:16,370
all.

43
00:01:16,370 --> 00:01:18,450
When an app asks for data, it
wasn't granted.

44
00:01:18,450 --> 00:01:19,810
Graph refuses the request and

45
00:01:19,810 --> 00:01:21,049
returns an error instead of the

46
00:01:21,049 --> 00:01:21,530
answer.

47
00:01:21,530 --> 00:01:23,769
The permission name is what's
printed on the key card, and

48
00:01:23,769 --> 00:01:26,010
that card decides which doors
open for that app.

49
00:01:26,010 --> 00:01:28,370
Being signed in and being
permitted are two separate

50
00:01:28,370 --> 00:01:31,049
gates, and beginners blur them
together all the time.

51
00:01:31,049 --> 00:01:33,489
A person can be signed in and
still see nothing, because the

52
00:01:33,489 --> 00:01:35,409
app was never granted the
permission that matches the

53
00:01:35,409 --> 00:01:38,329
request, and no amount of
logging in again will fix it.

54
00:01:38,329 --> 00:01:41,370
What makes this one model worth
learning is how far it reaches.

55
00:01:41,370 --> 00:01:43,609
The same permission system
covers exchange, mail,

56
00:01:43,609 --> 00:01:47,010
SharePoint, and OneDrive files,
teams, and the users and groups.

57
00:01:47,010 --> 00:01:49,609
In Microsoft Entra ID, that
means a single permission name

58
00:01:49,609 --> 00:01:52,129
can decide how far an app
travels across all of it.

59
00:01:52,129 --> 00:01:54,129
It's also why the name deserves
a second look.

60
00:01:54,129 --> 00:01:55,209
Say you build a small app that

61
00:01:55,209 --> 00:01:56,510
greets people by name when they

62
00:01:56,510 --> 00:01:57,170
sign in.

63
00:01:57,170 --> 00:01:58,290
It needs to read a bit of the

64
00:01:58,290 --> 00:01:59,980
signed in user's profile and

65
00:01:59,980 --> 00:02:00,790
nothing more.

66
00:02:00,790 --> 00:02:02,150
So it asks for one narrow

67
00:02:02,150 --> 00:02:03,709
permission that covers exactly

68
00:02:03,709 --> 00:02:03,950
that.

69
00:02:03,950 --> 00:02:06,310
If it instead asks for
permission to change every

70
00:02:06,310 --> 00:02:09,030
profile in the company, the
request would still work.

71
00:02:09,030 --> 00:02:11,770
And that gap between what the
app needs and what it asked for

72
00:02:11,770 --> 00:02:13,310
is where trouble lives.

73
00:02:13,310 --> 00:02:15,789
Microsoft doesn't make you guess
at any of this.

74
00:02:15,789 --> 00:02:18,430
Every permission in graph is
documented, named in a

75
00:02:18,430 --> 00:02:21,150
consistent way and grouped by
the resource it touches.

76
00:02:21,150 --> 00:02:22,389
So you can look one up and read

77
00:02:22,389 --> 00:02:23,789
what it allows before you ever

78
00:02:23,789 --> 00:02:24,669
approve it.

79
00:02:24,669 --> 00:02:26,750
The vocabulary is smaller than
it looks, too.

80
00:02:26,750 --> 00:02:30,150
There are permissions for mail,
calendars, files, groups, users,

81
00:02:30,150 --> 00:02:33,030
and the apps themselves, and
they all follow the same shape.

82
00:02:33,030 --> 00:02:35,349
So learning one teaches you how
to read the rest.

83
00:02:35,349 --> 00:02:38,069
The other thing worth knowing
early is that a permission is

84
00:02:38,069 --> 00:02:41,349
attached to an app, rather than
to a person or a device.

85
00:02:41,349 --> 00:02:44,110
Two people using the same app
share the app's permissions, and

86
00:02:44,110 --> 00:02:46,229
when the app was granted
something broad, both of them

87
00:02:46,229 --> 00:02:48,030
inherit that reach the moment
they sign in.

88
00:02:48,030 --> 00:02:50,509
There's one small word inside
these names that decides whether

89
00:02:50,509 --> 00:02:53,750
an app touches a single person's
data or everyone's, and we'll

90
00:02:53,750 --> 00:02:55,629
come back to it in a moment.

91
00:02:55,629 --> 00:02:57,110
The two kinds of permission.

92
00:02:57,110 --> 00:02:59,270
Nobody separates at first graph

93
00:02:59,270 --> 00:03:00,599
gives an AB two completely

94
00:03:00,599 --> 00:03:01,840
different ways to ask, and

95
00:03:01,840 --> 00:03:03,120
almost everything else about

96
00:03:03,120 --> 00:03:04,759
permissions flows from that one

97
00:03:04,759 --> 00:03:05,599
split.

98
00:03:05,599 --> 00:03:07,840
The first way is called
delegated access, and it means

99
00:03:07,840 --> 00:03:10,479
the app calls graph on behalf of
a signed in user.

100
00:03:10,479 --> 00:03:13,000
The app borrows that person's
identity for the moment of the

101
00:03:13,000 --> 00:03:16,159
request, and it can never reach
past what that person can

102
00:03:16,159 --> 00:03:17,680
already reach on their own.

103
00:03:17,680 --> 00:03:19,120
If your account can't open a

104
00:03:19,120 --> 00:03:20,919
particular folder, an app acting

105
00:03:20,919 --> 00:03:22,400
as you can't open it either, no

106
00:03:22,400 --> 00:03:23,439
matter which permissions it

107
00:03:23,439 --> 00:03:24,000
holds.

108
00:03:24,000 --> 00:03:25,719
The second way is called
Application Access.

109
00:03:25,719 --> 00:03:27,879
And here the app calls graph as
itself.

110
00:03:27,879 --> 00:03:29,240
With nobody signed in at all.

111
00:03:29,240 --> 00:03:31,639
There's no person to borrow an
identity from, so the app's own

112
00:03:31,639 --> 00:03:34,060
permissions are the only limit,
and that limit can stretch

113
00:03:34,060 --> 00:03:35,520
across the whole organization.

114
00:03:35,520 --> 00:03:36,759
Microsoft's own documentation

115
00:03:36,759 --> 00:03:38,000
gives a blunt example, because

116
00:03:38,000 --> 00:03:40,520
an app holding the files read

117
00:03:40,520 --> 00:03:42,080
all application permission can

118
00:03:42,080 --> 00:03:42,960
read any file in the

119
00:03:42,960 --> 00:03:44,680
organization, not one person's

120
00:03:44,680 --> 00:03:45,080
files.

121
00:03:45,080 --> 00:03:45,800
All of them.

122
00:03:45,800 --> 00:03:47,080
What surprises people here is

123
00:03:47,080 --> 00:03:48,520
the overlap in the delegated

124
00:03:48,520 --> 00:03:49,000
model.

125
00:03:49,000 --> 00:03:50,360
The app's real access is the

126
00:03:50,360 --> 00:03:51,639
intersection of two things the

127
00:03:51,639 --> 00:03:53,240
permissions it was granted, and

128
00:03:53,240 --> 00:03:54,479
whatever the signed in user

129
00:03:54,479 --> 00:03:55,639
already had.

130
00:03:55,639 --> 00:03:58,240
Both limits apply at the same
time, so a generous permission

131
00:03:58,240 --> 00:04:00,699
handed to an app doesn't widen
what the person can see.

132
00:04:00,699 --> 00:04:03,340
That overlap is the reason
delegated access is treated as

133
00:04:03,340 --> 00:04:06,340
the safer default, and Microsoft
says so, directly calling it the

134
00:04:06,340 --> 00:04:08,740
recommended approach whenever it
meets the app's needs.

135
00:04:08,740 --> 00:04:10,979
The instinct that flips here is
worth naming.

136
00:04:10,979 --> 00:04:12,199
You might think asking for more

137
00:04:12,199 --> 00:04:13,699
is the safe move, but the app

138
00:04:13,699 --> 00:04:14,979
only model is actually the one

139
00:04:14,979 --> 00:04:15,979
that reaches your entire

140
00:04:15,979 --> 00:04:17,459
company, and it's the one that

141
00:04:17,459 --> 00:04:18,819
triggers the loudest consent

142
00:04:18,819 --> 00:04:19,899
prompt.

143
00:04:19,899 --> 00:04:22,980
Asking for everything points
straight at the riskiest option.

144
00:04:22,980 --> 00:04:25,540
The better question is never how
much access makes this easy.

145
00:04:25,540 --> 00:04:27,300
It's how little access makes
this work.

146
00:04:27,300 --> 00:04:28,220
This split also answers

147
00:04:28,220 --> 00:04:29,180
something you may have wondered

148
00:04:29,180 --> 00:04:30,420
about, which is why the same app

149
00:04:30,420 --> 00:04:31,579
sometimes asks you to sign in

150
00:04:31,579 --> 00:04:32,540
and sometimes asks an

151
00:04:32,540 --> 00:04:33,740
administrator instead.

152
00:04:33,740 --> 00:04:36,019
The model it chose decides who
gets asked.

153
00:04:36,019 --> 00:04:37,100
The practical version of the

154
00:04:37,100 --> 00:04:38,139
split comes down to one

155
00:04:38,139 --> 00:04:38,579
question.

156
00:04:38,579 --> 00:04:40,579
If a person has to be present
for the work to happen,

157
00:04:40,579 --> 00:04:43,500
delegated access usually fits if
the work has to happen while

158
00:04:43,500 --> 00:04:46,459
everyone is asleep, application
access is the only option, and

159
00:04:46,459 --> 00:04:49,019
that's the moment to slow down
and ask what the smallest

160
00:04:49,019 --> 00:04:50,579
version of it looks like.

161
00:04:50,579 --> 00:04:52,740
How to read a permission name
like a sentence.

162
00:04:52,740 --> 00:04:55,319
Every graph permission name
follows the same three part

163
00:04:55,319 --> 00:04:57,379
shape, and once you see it, you
can't unsee it.

164
00:04:57,379 --> 00:04:58,584
The first part names the

165
00:04:58,584 --> 00:04:59,810
resource, the thing being

166
00:04:59,810 --> 00:05:00,430
touched.

167
00:05:00,430 --> 00:05:01,430
The second part names the

168
00:05:01,430 --> 00:05:02,949
operation usually read or read

169
00:05:02,949 --> 00:05:03,629
and write.

170
00:05:03,629 --> 00:05:06,350
The third part is the constraint
and it's optional, which is the

171
00:05:06,350 --> 00:05:07,709
detail that matters most.

172
00:05:07,709 --> 00:05:09,990
Read a few out loud and the
patent shows up fast.

173
00:05:09,990 --> 00:05:11,509
User dot read lets an app read

174
00:05:11,509 --> 00:05:12,589
the signed in user's own

175
00:05:12,589 --> 00:05:13,470
profile.

176
00:05:13,470 --> 00:05:14,870
Group A create is for making new

177
00:05:14,870 --> 00:05:16,029
groups, though not changing or

178
00:05:16,029 --> 00:05:16,949
deleting them.

179
00:05:16,949 --> 00:05:17,949
Application.

180
00:05:17,949 --> 00:05:18,310
Read.

181
00:05:18,310 --> 00:05:22,230
Write all reaches every app in
the tenant while application

182
00:05:22,230 --> 00:05:26,509
read write owned by shrinks that
to only the apps the app itself

183
00:05:26,509 --> 00:05:28,350
created or owns.

184
00:05:28,350 --> 00:05:30,910
The constraint is where the
reach lives, and it comes in a

185
00:05:30,910 --> 00:05:31,949
small set of words.

186
00:05:31,949 --> 00:05:34,709
All means the whole organization
owned by narrows things to what

187
00:05:34,709 --> 00:05:35,990
the app owns.

188
00:05:35,990 --> 00:05:39,730
Selected, shared, hidden and app
folder each tighten the scope in

189
00:05:39,730 --> 00:05:40,670
their own way.

190
00:05:40,670 --> 00:05:43,149
The payoff of that flagged word
arrives right here.

191
00:05:43,149 --> 00:05:44,990
When a permission carries no
constraint at all.

192
00:05:44,990 --> 00:05:47,110
The default is that one person's
own data.

193
00:05:47,110 --> 00:05:48,670
That's why user read reads u

194
00:05:48,670 --> 00:05:50,629
while user read all reads

195
00:05:50,629 --> 00:05:51,069
everyone.

196
00:05:51,069 --> 00:05:53,790
And the missing word is doing an
enormous amount of work on a

197
00:05:53,790 --> 00:05:55,149
screen that's easy to skim.

198
00:05:55,149 --> 00:05:56,790
One honest limit belongs here

199
00:05:56,790 --> 00:05:58,339
because names describe intent,

200
00:05:58,339 --> 00:05:59,569
and intent isn't always the

201
00:05:59,569 --> 00:06:00,449
whole story.

202
00:06:00,449 --> 00:06:03,810
Microsoft's own materials note
that names like mail, read,

203
00:06:03,810 --> 00:06:08,170
write, and sites dot full
control all imply broad reach,

204
00:06:08,170 --> 00:06:11,209
and the practical advice is to
test in a safe tenant rather

205
00:06:11,209 --> 00:06:12,889
than trusting the label alone.

206
00:06:12,889 --> 00:06:16,089
This is the skill that changes
how you read a consent screen.

207
00:06:16,089 --> 00:06:17,370
Instead of seeing a wall of

208
00:06:17,370 --> 00:06:18,850
unfamiliar names, you start

209
00:06:18,850 --> 00:06:20,250
seeing sentences and the

210
00:06:20,250 --> 00:06:21,329
sentence tells you who is

211
00:06:21,329 --> 00:06:22,730
affected and how far the app can

212
00:06:22,730 --> 00:06:23,209
go.

213
00:06:23,209 --> 00:06:24,529
The name stay consistent across

214
00:06:24,529 --> 00:06:25,889
the whole service, so the effort

215
00:06:25,889 --> 00:06:27,129
you spend learning this shape

216
00:06:27,129 --> 00:06:28,449
pays off everywhere, and none of

217
00:06:28,449 --> 00:06:29,610
it asks you to memorize a

218
00:06:29,610 --> 00:06:30,769
separate dictionary.

219
00:06:30,769 --> 00:06:33,290
You'll also notice the names are
specific enough to argue with

220
00:06:33,290 --> 00:06:34,329
which is the point.

221
00:06:34,329 --> 00:06:35,769
A permission that says all is

222
00:06:35,769 --> 00:06:36,930
telling you in plain language

223
00:06:36,930 --> 00:06:38,170
that it crosses every part of

224
00:06:38,170 --> 00:06:39,449
the organization, so nobody can

225
00:06:39,449 --> 00:06:40,490
claim the reach came as a

226
00:06:40,490 --> 00:06:41,250
surprise.

227
00:06:41,250 --> 00:06:43,889
If a name feels too broad for
the job, it usually is, and

228
00:06:43,889 --> 00:06:48,329
there's almost always a smaller
one nearby who gets to say yes.

229
00:06:48,329 --> 00:06:50,730
Reading the name tells you what
an app wants.

230
00:06:50,730 --> 00:06:52,850
It doesn't tell you who's
allowed to hand it over.

231
00:06:52,850 --> 00:06:54,610
And that second question has its

232
00:06:54,610 --> 00:06:56,129
own set of rules for delegated

233
00:06:56,129 --> 00:06:56,649
permissions.

234
00:06:56,649 --> 00:06:58,459
The answer is fairly forgiving.

235
00:06:58,459 --> 00:06:59,660
A person can consent for their

236
00:06:59,660 --> 00:07:01,259
own data, which is why a small

237
00:07:01,259 --> 00:07:02,459
app can ask you to approve a

238
00:07:02,459 --> 00:07:03,639
narrow permission the moment you

239
00:07:03,639 --> 00:07:04,339
sign in.

240
00:07:04,339 --> 00:07:06,899
An administrator can also
consent on behalf of everyone at

241
00:07:06,899 --> 00:07:09,540
once, which helps when you'd
rather not make every colleague

242
00:07:09,540 --> 00:07:12,259
click through the same prompt
for application permissions, the

243
00:07:12,259 --> 00:07:13,740
door narrows sharply.

244
00:07:13,740 --> 00:07:16,220
Only an administrator can
consent, and Microsoft is

245
00:07:16,220 --> 00:07:18,939
specific about which ones
privileged role administrator

246
00:07:18,939 --> 00:07:22,259
and global administrator are the
two roles that can grant an app.

247
00:07:22,259 --> 00:07:23,980
The app only permissions it's
asking for.

248
00:07:23,980 --> 00:07:25,060
If you've ever watched a rollout

249
00:07:25,060 --> 00:07:26,339
stall while everyone waited on

250
00:07:26,339 --> 00:07:27,920
one person, this is usually why

251
00:07:27,920 --> 00:07:29,100
there's also a convenience

252
00:07:29,100 --> 00:07:30,560
feature that's easy to overlook,

253
00:07:30,560 --> 00:07:32,060
called tenant wide admin

254
00:07:32,060 --> 00:07:32,939
consent.

255
00:07:32,939 --> 00:07:35,540
An administrator approves an app
once for everyone, and after

256
00:07:35,540 --> 00:07:37,860
that, people aren't nagged with
prompts when they sign in, it

257
00:07:37,860 --> 00:07:40,939
removes friction, and it also
means the approval decision gets

258
00:07:40,939 --> 00:07:43,779
made far away from the people
who'll actually use the thing.

259
00:07:43,779 --> 00:07:45,160
One more gate sits on top of all

260
00:07:45,160 --> 00:07:46,259
of this, and it belongs to your

261
00:07:46,259 --> 00:07:47,540
own organization.

262
00:07:47,540 --> 00:07:49,839
Even when a permission
technically allows a user to

263
00:07:49,839 --> 00:07:53,220
consent, your tenant's app,
consent policies can restrict or

264
00:07:53,220 --> 00:07:56,139
block that, and plenty of
organizations do exactly that.

265
00:07:56,139 --> 00:07:57,300
A permission can be perfectly

266
00:07:57,300 --> 00:07:59,120
valid on paper and still stop at

267
00:07:59,120 --> 00:08:00,120
a policy someone set

268
00:08:00,120 --> 00:08:00,959
deliberately.

269
00:08:00,959 --> 00:08:03,639
The moment of consent is worth
watching closely, because it's

270
00:08:03,639 --> 00:08:06,240
the clearest view you'll ever
get of what an app can do.

271
00:08:06,240 --> 00:08:08,879
The prompt lists the permissions
in plain language, and a

272
00:08:08,879 --> 00:08:11,639
delegated request reads like a
request to act as you.

273
00:08:11,639 --> 00:08:13,839
While an application request
reads like a request to act

274
00:08:13,839 --> 00:08:16,600
across everyone reading that
screen instead of clicking past.

275
00:08:16,600 --> 00:08:18,720
It is the cheapest security
habit there is.

276
00:08:18,720 --> 00:08:20,079
This is why the same app can

277
00:08:20,079 --> 00:08:21,439
install smoothly in a test

278
00:08:21,439 --> 00:08:23,079
tenant and grind to a halt in a

279
00:08:23,079 --> 00:08:23,519
real one.

280
00:08:23,519 --> 00:08:24,600
Test tenants tend to leave

281
00:08:24,600 --> 00:08:25,879
consent open, and production

282
00:08:25,879 --> 00:08:27,439
tenants tend to close it, so the

283
00:08:27,439 --> 00:08:29,000
app's success has less to do

284
00:08:29,000 --> 00:08:30,439
with the app than with the rules

285
00:08:30,439 --> 00:08:31,079
around it.

286
00:08:31,079 --> 00:08:33,480
Once the approval is in hand,
the next question is how big

287
00:08:33,480 --> 00:08:34,360
that approval should be.

288
00:08:34,360 --> 00:08:37,840
And that's where most projects
get themselves into trouble.

289
00:08:37,840 --> 00:08:39,679
The trap of asking for too much.

290
00:08:39,679 --> 00:08:41,600
Everything so far leads to one

291
00:08:41,600 --> 00:08:43,279
habit that separates a smooth

292
00:08:43,279 --> 00:08:44,960
rollout from a painful one, and

293
00:08:44,960 --> 00:08:46,740
Microsoft states it plainly

294
00:08:46,740 --> 00:08:48,039
grant the app the minimum

295
00:08:48,039 --> 00:08:49,200
permission it needs for the

296
00:08:49,200 --> 00:08:50,840
operation, and nothing beyond

297
00:08:50,840 --> 00:08:51,360
that.

298
00:08:51,360 --> 00:08:53,639
Microsoft's own examples make
the Gap concrete.

299
00:08:53,639 --> 00:08:57,044
An app that reads the signed in
user's profile, needs only user

300
00:08:57,044 --> 00:08:58,090
read and handing it.

301
00:08:58,090 --> 00:09:00,769
User read write makes it
overprivileged because the app

302
00:09:00,769 --> 00:09:02,330
never needs to change anything.

303
00:09:02,330 --> 00:09:03,529
Reading groups without a signed

304
00:09:03,529 --> 00:09:05,389
in user needs only group member

305
00:09:05,389 --> 00:09:06,370
read all.

306
00:09:06,370 --> 00:09:07,750
A calendar that's only ever read

307
00:09:07,750 --> 00:09:09,490
needs calendars read while

308
00:09:09,490 --> 00:09:09,929
calendars.

309
00:09:09,929 --> 00:09:12,570
Read write belongs to apps that
actually schedule something.

310
00:09:12,570 --> 00:09:14,929
The real tension here is what
happens when you ignore it

311
00:09:14,929 --> 00:09:17,970
because the cost is documented
rather than theoretical.

312
00:09:17,970 --> 00:09:19,529
Granting an app more privileges

313
00:09:19,529 --> 00:09:21,370
than it needs is a poor security

314
00:09:21,370 --> 00:09:22,970
practice, in Microsoft's words,

315
00:09:22,970 --> 00:09:24,169
because it raises the app's

316
00:09:24,169 --> 00:09:25,690
exposure to unauthorized and

317
00:09:25,690 --> 00:09:26,970
unintended access.

318
00:09:26,970 --> 00:09:29,929
The same overreach carries a
second cost that hits adoption.

319
00:09:29,929 --> 00:09:31,049
Since asking for more than

320
00:09:31,049 --> 00:09:32,470
necessary makes people refuse to

321
00:09:32,470 --> 00:09:34,669
consent, and a refused consent

322
00:09:34,669 --> 00:09:36,289
screen ends the rollout right

323
00:09:36,289 --> 00:09:36,690
there.

324
00:09:36,690 --> 00:09:39,289
There's a hard ceiling to which
surprises people who assume

325
00:09:39,289 --> 00:09:40,730
permissions are unlimited.

326
00:09:40,730 --> 00:09:44,009
Microsoft Entry ID caps an app
at four hundred permissions, and

327
00:09:44,009 --> 00:09:46,250
no more than four hundred of
those can be graph permissions

328
00:09:46,250 --> 00:09:47,529
for work and school apps.

329
00:09:47,529 --> 00:09:49,850
Personal Microsoft Account apps
are capped at thirty.

330
00:09:49,850 --> 00:09:52,649
If you are picturing an endless
menu, it isn't one picture how

331
00:09:52,649 --> 00:09:53,889
this plays out in practice.

332
00:09:53,889 --> 00:09:55,289
A team wants SharePoint data for

333
00:09:55,289 --> 00:09:56,779
a quarterly report and asks for

334
00:09:56,779 --> 00:09:58,389
access to every site and the

335
00:09:58,389 --> 00:09:59,830
request lands in security review

336
00:09:59,830 --> 00:10:00,389
and stops.

337
00:10:00,389 --> 00:10:02,870
They trim the list down to the
sites they actually read.

338
00:10:02,870 --> 00:10:04,110
Attach a short note explaining

339
00:10:04,110 --> 00:10:05,429
why each one is needed, and the

340
00:10:05,429 --> 00:10:06,789
approval moves in a fraction of

341
00:10:06,789 --> 00:10:07,429
the time.

342
00:10:07,429 --> 00:10:09,870
The permission list was the
whole problem, and it was the

343
00:10:09,870 --> 00:10:11,549
one part they controlled.

344
00:10:11,549 --> 00:10:13,669
The lesson is unglamorous and it
works.

345
00:10:13,669 --> 00:10:15,029
Ask for what the app does today

346
00:10:15,029 --> 00:10:16,269
rather than for what it might do

347
00:10:16,269 --> 00:10:16,909
someday.

348
00:10:16,909 --> 00:10:18,110
Because every extra permission

349
00:10:18,110 --> 00:10:19,250
is a question somebody has to

350
00:10:19,250 --> 00:10:20,409
answer before you're allowed to

351
00:10:20,409 --> 00:10:21,029
ship.

352
00:10:21,029 --> 00:10:23,509
There's a simple test you can
run on any permissionless before

353
00:10:23,509 --> 00:10:24,830
you send it for approval.

354
00:10:24,830 --> 00:10:26,149
For each permission, name the

355
00:10:26,149 --> 00:10:27,429
exact feature that breaks

356
00:10:27,429 --> 00:10:28,269
without it.

357
00:10:28,269 --> 00:10:31,149
If you can't name one, that
permission is a wish rather than

358
00:10:31,149 --> 00:10:33,710
a requirement, and it's the
first thing a reviewer will ask

359
00:10:33,710 --> 00:10:35,269
you to justify.

360
00:10:35,269 --> 00:10:36,590
Where this breaks down.

361
00:10:36,590 --> 00:10:39,029
Careful permission choices get
you most of the way, and they

362
00:10:39,029 --> 00:10:40,509
don't remove every wall.

363
00:10:40,509 --> 00:10:41,950
Some limits belong to the system

364
00:10:41,950 --> 00:10:43,549
itself, and knowing them early

365
00:10:43,549 --> 00:10:44,750
saves a confusing afternoon

366
00:10:44,750 --> 00:10:45,309
later.

367
00:10:45,309 --> 00:10:47,950
The first of them is easy to
misread, and it wastes the most

368
00:10:47,950 --> 00:10:50,909
time when an app asks for the
members of a group graph, can

369
00:10:50,909 --> 00:10:53,870
answer with a success code and
still hand back almost nothing.

370
00:10:53,870 --> 00:10:56,274
Members whose type the app isn't
permitted to read come back with

371
00:10:56,274 --> 00:10:59,080
little more than an identifier
and their real properties arrive

372
00:10:59,080 --> 00:11:00,080
as empty values.

373
00:11:00,080 --> 00:11:01,559
The request succeeded, and the

374
00:11:01,559 --> 00:11:02,960
data simply isn't there, which

375
00:11:02,960 --> 00:11:04,340
is why the failure is so easy to

376
00:11:04,340 --> 00:11:04,960
miss.

377
00:11:04,960 --> 00:11:07,320
Then there are the permissions
that carry the most weight

378
00:11:07,320 --> 00:11:10,320
directory access as user, all is
the highest privilege.

379
00:11:10,320 --> 00:11:11,679
Delegated permission in graph,

380
00:11:11,679 --> 00:11:12,720
and it reaches nearly every

381
00:11:12,720 --> 00:11:14,159
operation across Microsoft entra

382
00:11:14,159 --> 00:11:15,200
ID directory.

383
00:11:15,200 --> 00:11:16,799
Read write all ranked second and

384
00:11:16,799 --> 00:11:18,360
directory read all is the

385
00:11:18,360 --> 00:11:18,759
strongest.

386
00:11:18,759 --> 00:11:20,879
Read only permission in that
same space.

387
00:11:20,879 --> 00:11:23,559
Microsoft's guidance on all
three is to use them only when

388
00:11:23,559 --> 00:11:24,919
nothing smaller will do.

389
00:11:24,919 --> 00:11:26,039
A narrower option exists for

390
00:11:26,039 --> 00:11:27,279
some situations, and it deserves

391
00:11:27,279 --> 00:11:28,240
a name.

392
00:11:28,240 --> 00:11:31,120
Resource specific consent grants
an app access to one instance of

393
00:11:31,120 --> 00:11:33,840
a resource, like a single team
or a single chat, instead of

394
00:11:33,840 --> 00:11:35,120
every instance in the tenant.

395
00:11:35,120 --> 00:11:36,519
It's supported for a subset of

396
00:11:36,519 --> 00:11:38,059
features such as teams, chats,

397
00:11:38,059 --> 00:11:39,360
and messages, and it's the

398
00:11:39,360 --> 00:11:40,720
closest thing to a scalpel in a

399
00:11:40,720 --> 00:11:41,960
model that often feels like a

400
00:11:41,960 --> 00:11:42,480
hammer.

401
00:11:42,480 --> 00:11:44,639
Scale brings its own pushback
because graph slows you down

402
00:11:44,639 --> 00:11:45,759
when you ask to fast.

403
00:11:45,759 --> 00:11:48,519
When an app exceeds the limits,
graph returns a throttling error

404
00:11:48,519 --> 00:11:51,179
instead of the data, and the
global ceiling is one hundred

405
00:11:51,179 --> 00:11:54,480
and thirty thousand requests per
10s per app across all tenants

406
00:11:54,480 --> 00:11:57,460
with tighter limits underneath
for individual services.

407
00:11:57,460 --> 00:11:58,720
The fix is to read the retry

408
00:11:58,720 --> 00:12:00,100
after header, wait the amount of

409
00:12:00,100 --> 00:12:01,779
time it names and slow down

410
00:12:01,779 --> 00:12:02,740
rather than hammering the

411
00:12:02,740 --> 00:12:03,460
endpoint.

412
00:12:03,460 --> 00:12:04,580
The newest wrinkle points in a

413
00:12:04,580 --> 00:12:05,779
promising direction for

414
00:12:05,779 --> 00:12:07,580
Microsoft Entra Agent ID some

415
00:12:07,580 --> 00:12:09,019
high risk graph permissions are

416
00:12:09,019 --> 00:12:10,580
blocked outright and can't be

417
00:12:10,580 --> 00:12:12,019
granted to agent identities at

418
00:12:12,019 --> 00:12:13,139
all, which tells you the

419
00:12:13,139 --> 00:12:14,320
platform is moving toward

420
00:12:14,320 --> 00:12:15,620
tighter defaults rather than

421
00:12:15,620 --> 00:12:16,940
looser ones.

422
00:12:16,940 --> 00:12:18,340
None of these limits are reasons

423
00:12:18,340 --> 00:12:19,740
to avoid graph, and they're the

424
00:12:19,740 --> 00:12:20,899
reasons so much of this gets

425
00:12:20,899 --> 00:12:21,919
documented rather than

426
00:12:21,919 --> 00:12:23,299
discovered the hard way the

427
00:12:23,299 --> 00:12:24,340
system tells you when it

428
00:12:24,340 --> 00:12:25,700
throttles, it documents its

429
00:12:25,700 --> 00:12:27,220
privilege rankings, and it flags

430
00:12:27,220 --> 00:12:28,379
the permissions it considers

431
00:12:28,379 --> 00:12:28,899
risky.

432
00:12:28,899 --> 00:12:30,779
So most of the surprises are
avoidable.

433
00:12:30,779 --> 00:12:33,179
If you read first how this fits

434
00:12:33,179 --> 00:12:34,379
into your Microsoft three

435
00:12:34,379 --> 00:12:35,700
hundred sixty five and Azure

436
00:12:35,700 --> 00:12:36,379
World.

437
00:12:36,379 --> 00:12:39,740
All of this lives in a place you
may already recognize.

438
00:12:39,740 --> 00:12:42,820
The app itself is registered in
Microsoft Entra ID, and the

439
00:12:42,820 --> 00:12:45,100
consent it received is recorded
there as a grant.

440
00:12:45,100 --> 00:12:46,820
While the mail files and team's

441
00:12:46,820 --> 00:12:48,659
data sit behind the door in the

442
00:12:48,659 --> 00:12:49,820
Microsoft three hundred sixty

443
00:12:49,820 --> 00:12:51,460
five and Azure services you use

444
00:12:51,460 --> 00:12:52,419
every day.

445
00:12:52,419 --> 00:12:53,740
When someone asks who approved

446
00:12:53,740 --> 00:12:55,164
an app, entra ID holds the

447
00:12:55,164 --> 00:12:56,590
answer with that picture in

448
00:12:56,590 --> 00:12:57,149
place.

449
00:12:57,149 --> 00:12:59,990
A few habits turn the theory
into something workable.

450
00:12:59,990 --> 00:13:01,190
Keep user facing data on

451
00:13:01,190 --> 00:13:02,350
delegated permissions wherever

452
00:13:02,350 --> 00:13:03,149
you can.

453
00:13:03,149 --> 00:13:05,950
Reserve the app only model for
the jobs that genuinely run

454
00:13:05,950 --> 00:13:08,950
unattended, like a nightly sync
with nobody at the keyboard.

455
00:13:08,950 --> 00:13:11,429
Map out the permissions your
project needs before you build,

456
00:13:11,429 --> 00:13:14,029
because discovering them during
a security review is the slowest

457
00:13:14,029 --> 00:13:15,470
possible time to learn them.

458
00:13:15,470 --> 00:13:17,230
Staging helps to pilot with a

459
00:13:17,230 --> 00:13:18,629
small group of people first,

460
00:13:18,629 --> 00:13:19,909
show them what each permission

461
00:13:19,909 --> 00:13:21,169
does and what the app can never

462
00:13:21,169 --> 00:13:21,509
see.

463
00:13:21,509 --> 00:13:24,509
Then widen the audience once the
first group is comfortable.

464
00:13:24,509 --> 00:13:27,230
That approach builds advocates
instead of objections, and it

465
00:13:27,230 --> 00:13:29,629
gives you a chance to catch an
overbroad request while it's

466
00:13:29,629 --> 00:13:30,830
still cheap to change.

467
00:13:30,830 --> 00:13:32,070
Write down why each permission

468
00:13:32,070 --> 00:13:33,710
is required in one plain

469
00:13:33,710 --> 00:13:34,230
sentence.

470
00:13:34,230 --> 00:13:35,389
That short justification is

471
00:13:35,389 --> 00:13:36,669
often the difference between an

472
00:13:36,669 --> 00:13:38,110
approval that moves and one that

473
00:13:38,110 --> 00:13:38,750
sits.

474
00:13:38,750 --> 00:13:41,110
And it's also the thing you'll
want when the app gets reviewed

475
00:13:41,110 --> 00:13:42,190
six months later.

476
00:13:42,190 --> 00:13:44,470
The plumbing underneath is more
familiar than it sounds.

477
00:13:44,470 --> 00:13:47,070
The same permission model sits
under the Power Automate flows.

478
00:13:47,070 --> 00:13:49,509
You build the power apps
connectors you add, and the

479
00:13:49,509 --> 00:13:51,870
copilot agents you're starting
to spin up.

480
00:13:51,870 --> 00:13:53,029
So the habit travels with you

481
00:13:53,029 --> 00:13:54,309
across every tool in the

482
00:13:54,309 --> 00:13:55,370
platform.

483
00:13:55,370 --> 00:13:58,330
The order you do this in matters
more than the individual steps.

484
00:13:58,330 --> 00:14:01,210
Decide what the app needs, write
it down, get the approval

485
00:14:01,210 --> 00:14:04,169
conversation started, and only
then build the part that depends

486
00:14:04,169 --> 00:14:05,210
on the access.

487
00:14:05,210 --> 00:14:08,129
Teams that build first and ask
later spend their best weeks

488
00:14:08,129 --> 00:14:10,610
waiting on a consent screen
instead of shipping.

489
00:14:10,610 --> 00:14:11,730
Governance is what keeps the

490
00:14:11,730 --> 00:14:12,809
habit alive through a busy

491
00:14:12,809 --> 00:14:13,370
quarter.

492
00:14:13,370 --> 00:14:14,570
Pre-Approval workflows.

493
00:14:14,570 --> 00:14:15,809
Clear tags on each app.

494
00:14:15,809 --> 00:14:16,929
Audit logs that record who

495
00:14:16,929 --> 00:14:18,330
consented to what, and a

496
00:14:18,330 --> 00:14:19,570
periodic review of permissions

497
00:14:19,570 --> 00:14:20,929
that are no longer needed or

498
00:14:20,929 --> 00:14:21,850
keep an environment from

499
00:14:21,850 --> 00:14:23,230
drifting slowly into over

500
00:14:23,230 --> 00:14:24,289
permission.

501
00:14:24,289 --> 00:14:25,649
What to take away.

502
00:14:25,649 --> 00:14:26,570
That's the whole picture.

503
00:14:26,570 --> 00:14:28,450
In plain terms, a permission is

504
00:14:28,450 --> 00:14:29,970
the privilege Microsoft Graph

505
00:14:29,970 --> 00:14:31,409
demands before an app can touch

506
00:14:31,409 --> 00:14:32,370
your data.

507
00:14:32,370 --> 00:14:35,309
Delegated access acts as a
person, and application access

508
00:14:35,309 --> 00:14:36,929
acts as the app itself.

509
00:14:36,929 --> 00:14:39,289
The name on the permission tells
you exactly how far it can

510
00:14:39,289 --> 00:14:42,009
reach, and an administrator
holds the final yes.

511
00:14:42,009 --> 00:14:44,169
One question is worth sitting
with for a moment.

512
00:14:44,169 --> 00:14:45,409
If you opened your own tenant

513
00:14:45,409 --> 00:14:46,730
today, which apps permissions

514
00:14:46,730 --> 00:14:47,970
would you want to double check

515
00:14:47,970 --> 00:14:48,450
first?

516
00:14:48,450 --> 00:14:49,690
If this made the topic feel less

517
00:14:49,690 --> 00:14:51,929
intimidating, subscribe to M365

518
00:14:51,929 --> 00:14:53,690
FM to master the tools and the

519
00:14:53,690 --> 00:14:55,129
mindset shaping the future of

520
00:14:55,129 --> 00:14:55,730
work.
