ソーシャルネットワーク認証を使用するAzureモバイルアプリがあります。カスタムトークンハンドラを使用して、要求としてユーザーロールを追加しようとしています。カスタムロールクレームを使用したAzureモバイルアプリ認証 - クレームが消える
これはすべてlocalhost上で実行されているときに動作します。トークンはトークンハンドラに追加され、AuthorizationAttribute OnAuthorizationメソッドが呼び出されたときに使用できます。指定されたロールによる属性の承認は、期待通りに機能します。
実行中の場合、クレームが追加されますが、OnAuthorizationメソッドが呼び出されると、カスタムロールクレームはなくなります。
起動/コンフィグクラス
public class OwinStartup
{
public void Configuration(IAppBuilder app)
{
var config = GlobalConfiguration.Configuration;
new MobileAppConfiguration()
.AddPushNotifications()
.ApplyTo(config);
MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().
GetMobileAppSettings();
app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions()
{
SigningKey = ConfigurationManager.AppSettings["authSigningKey"],
ValidAudiences = new[] { ConfigurationManager.AppSettings["authAudience"] },
ValidIssuers = new[] { ConfigurationManager.AppSettings["authIssuer"] },
TokenHandler = new AppServiceTokenHandlerWithCustomClaims(config)
});
//Authenticate stage handler in OWIN Pipeline
app.Use((context, next) =>
{
return next.Invoke();
});
app.UseStageMarker(PipelineStage.Authenticate);
}
トークンハンドラの役割を追加し
public class AppServiceTokenHandlerWithCustomClaims : AppServiceTokenHandler
{
public AppServiceTokenHandlerWithCustomClaims(HttpConfiguration config)
: base(config)
{
}
public override bool TryValidateLoginToken(
string token,
string signingKey,
IEnumerable<string> validAudiences,
IEnumerable<string> validIssuers,
out ClaimsPrincipal claimsPrincipal)
{
var validated = base.TryValidateLoginToken(token, signingKey, validAudiences, validIssuers, out claimsPrincipal);
if (validated)
{
string sid = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier).Value;
var roleProvider = UnityConfig.Container.Resolve<IRoleProvider>("RoleProvider");
var roles = roleProvider.GetUserRolesBySid(sid);
foreach (var role in roles)
{
((ClaimsIdentity)claimsPrincipal.Identity).AddClaim(new Claim(ClaimTypes.Role, role));
}
}
return validated;
}
}
役割項 例の主張:ここ
コードでありますアイデンティティclからのロールクレームコレクション
{http://schemas.microsoft.com/ws/2008/06/identity/claims/role: admin}
承認は、Web APIをコントローラ
[Authorize(Roles = "admin")]
承認は、指定された1つまたは複数の役割を持つ属性があるエンドポイントへのすべての呼び出しが失敗した(401)
わからないにの属性目指しますAzureで動作しているときに、アイデンティティに残っていたか、または保持されていないクレームが起きているかどうか。
おかげ マイケル
私はログイン後に新しいエンドポイントを呼び出す必要があります。有効なトークンがあれば、そのエンドポイントでロールクレームを含む新しいトークンを作成し、それをクライアントに返します。その後、そのトークンを使用するすべての呼び出しには、承認フィルタが検証し、要求されたリソースへのアクセスを許可する必要があるかどうかを判断する新しい役割クレームが含まれます。 – MIantosca
これを行うこともできますし、 APIのルックアップとクレーム調整を1つにまとめたものです。私はおそらく、私が主張にあるものを正確に管理しているので、後者を個人的に行うだろう。しかし、どちらも可能性です。 –