2016-09-22 17 views
0

ASP NET MVC WebサイトでOpenID Connect標準を使用したサンプルアプリケーションを実装しました。私の目標は機密データをAzureに保存することをアウトソースして、Azure Active Directoryを使用することでした。 Azureのユーザーにカスタムプロパティを追加することは不可能なので、プライベートdbに非機密ユーザーのクレームを保存します。OpenID Connect ASP NET MVC AAD

new OpenIdConnectAuthenticationOptions 
      { 
       ClientId = clientId, 
       Authority = authority, 
       PostLogoutRedirectUri = postLogoutRedirectUri, 
       RedirectUri = postLogoutRedirectUri, 
       Notifications = new OpenIdConnectAuthenticationNotifications 
       { 
        AuthorizationCodeReceived = context => 
        { 
         var objectId = context.AuthenticationTicket.Identity.Claims.First(x => x.Type == "http://schemas.microsoft.com/identity/claims/objectidentifier"); 
         var claims = GetUserClaims(objectId.Value); 
         foreach (var item in claims) 
         { 
          context.AuthenticationTicket.Identity.AddClaim(new System.Security.Claims.Claim(item.Key, item.Value)); 
         } 
         return Task.FromResult(0); 
        } 
       } 

これらの請求項は結構です、ユーザサインアウトするまで、私のユーザーオブジェクトに固執するので、私はクッキーに必要な主張を追加しました。この方法をしかし:私はこの主張を取得し、このようなクッキーにそれらを「追加」するために管理しましたセッション中に変更できるクレームが1つあります(基本的にユーザーは1ページで変更できます)。問題は、クッキー内のこのクレームを "変更"して永続する方法を見つけることができないことです。理想的には私は何とか

を強制したい

に再び呼び出される関数をAuthorizationCodeReceived。出来ますか ?または、クッキーに保存されている値を交換する別の方法がありますか?

私の唯一の解決策は、この値を変更したときにユーザーをログアウトして再度サインアウトするようにして、AuthorizationCodeReceivedのコールバックをもう一度呼び出すことですが、ユーザーフレンドリーではありません。

答えて

0

HttpContext.GetOwinContext()を呼び出すことができます。認証オブジェクトにクレームを追加した後でAuthentication.SignIn()を実行し、新しいクレームをCookieに保持します。

+0

あなたに知らせてください。 – MajkeloDev

+0

私はこれを試しました。それはAuthorizationCodeReceivedを呼び出さなかったがうまくいかなかったが、これはうまくいきました。HttpContext.GetOwinContext()。Authentication.Challenge(新しいAuthenticationProperties {RedirectUri = "/"}、OpenIdConnectAuthenticationDefaults.AuthenticationType); – MajkeloDev

+0

私のコードであなたの答えを告げると、私はそれを完了としてマークします。誰かがそれを見つけることができます有用:)#を – MajkeloDev