傳統角色型授權將應用程式綁定特定角色群組。宣告式模型以「宣告」為核心,解耦身分驗證與授權邏輯,支援多種認證來源(Windows、UserName、憑證、SAML Token)並利於聯合身分場景。
var authCtx = ServiceSecurityContext.Current.AuthorizationContext;
foreach (var cs in authCtx.ClaimSets)
if (cs.ContainsClaim(new Claim(..., "Delete", Rights.PossessProperty))) ...
// 設定 ServiceHost
var host = new ServiceHost(typeof(RelyingParty));
FederatedServiceCredentials.ConfigureServiceHost(host, new TrustedIssuerNameRegistry());
host.Open();
[PrincipalPermission(SecurityAction.Demand,
Role = "https://schemas.contoso.com/.../permission/Delete")]
public string DeleteSomething() { ... }
// 或程式碼檢查
if (!Thread.CurrentPrincipal.IsInRole(".../permission/Delete"))
throw new SecurityException("Access denied");
<microsoft.identityModel>
<issuerNameRegistry type="Services.TrustedIssuerNameRegistry, Services" />
<securityTokenHandlers>
<remove type="Microsoft.IdentityModel.Tokens.Saml11.Saml11SecurityTokenHandler, ..." />
<add type="Microsoft.IdentityModel.Tokens.Saml11.Saml11SecurityTokenHandler, ...">
<samlSecurityTokenRequirement audienceUriMode="Never">
<nameClaimType value="https://schemas.contoso.com/ws/2005/05/claims/name" />
<roleClaimTypes>
<add value="https://schemas.contoso.com/.../claims/permission" />
</roleClaimTypes>
</samlSecurityTokenRequirement>
</add>
</securityTokenHandlers>
</microsoft.identityModel>
自訂 roleClaimType 為權限宣告,即可沿用 PrincipalPermission 屬性進行細粒度授權。
自訂 ServiceHostFactory,於 InitializeRuntime 呼叫 FederatedServiceCredentials.ConfigureServiceHost,並在 .svc 指定 Factory 屬性。
IAuthorizationPolicy,改用 Geneva 內建 ServiceAuthorizationPolicy。AuthorizationContext 改為 ClaimsPrincipal。PrincipalPermission。