2016-07-14 15 views
4

私はADFSサーバーでASP.NET IDを使用しています。開発目的のために、私はADFSサーバーにアクセスできないネットワーク環境にいるときにADFSサーバーを使用しないでください。ログインしたアイデンティティユーザーを手動で設定するにはどうすればよいですか?

#if DEBUG 
    [AllowAnonymous] 
    public ActionResult LogIn() 
    { 
     var claims = new List<Claim>(); 
     claims.Add(new Claim(ClaimTypes.NameIdentifier, "tester")); 

     System.Web.HttpContext.Current.User = new ClaimsPrincipal(new ClaimsIdentity(claims)); 
     System.Threading.Thread.CurrentPrincipal = System.Web.HttpContext.Current.User; 

     return Redirect("Home/Index"); 
    } 
#endif 

そしてOwin設定方法:

public void Configuration(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions() { }); 

     app.UseWsFederationAuthentication(
      new WsFederationAuthenticationOptions 
      { 
       Wtrealm = realm, 
       MetadataAddress = adfsMetadata 
      }); 
    } 

私はWsFederation認証が使用部分をコメントアウト私は手動で現在ログインしているユーザー設定の私にHomeControllerでシンプルなコントローラのアクションを追加した理由です問題なく、現在のADFSサーバーへのリンクはありません。

問題:Authorize属性を持つHome/Indexアクションにリダイレクトされると、ASP.NET IDが有効なログインとしてClaimsPrincipalを認識しないため、ホーム/ホーム/ログインとホーム/インデックス間のループを常に作成するログインアクション。

私の質問:上記で作成したClaimsPrincipalを有効なログインとして受け入れるにはどうすればよいですか?

答えて

4

あなたが問題に近づくと、Cookieが設定されないため、ユーザー情報がHTTP要求を超えて保持されません。

#if DEBUG 
    [AllowAnonymous] 
    public ActionResult LogIn() 
    { 
     var identity = new ClaimsIdentity("ApplicationCookie", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType); 
     identity.AddClaim(new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "Active Directory")); 
     identity.AddClaim(new Claim(ClaimTypes.Name, "Testy McTestface")); 
     identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, "testUser")); 

     IAuthenticationManager authenticationManager = HttpContext.GetOwinContext().Authentication; 
     authenticationManager.SignOut("ApplicationCookie"); 
     authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity); 

     return Redirect("Home/Index"); 
    } 
#endif 

あなたはnugetパッケージMicrosoft.Owin.Security.Cookiesが必要になります、:あなたのアプローチは、あなたはまだクッキーを設定するOWINからIAuthenticationManagerを使用することができ、単一のコール(あなたのためにそこにいるの用途がありますが、ではない)

内で動作します Microsoft.Owin.Host.SystemWeb。 AD

での認証についての私のblog-postでより多くの説明は、あなたがまたCookieAuthenticationMiddlewareが設定correcltyであることを確認する必要があります参照してください。

public void Configuration(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = "ApplicationCookie", 
      LoginPath = new PathString("/Home/Login"), 
      Provider = new CookieAuthenticationProvider(), 
      CookieName = "ApplicationCookie", 
      CookieHttpOnly = true, 
      ExpireTimeSpan = TimeSpan.FromHours(1), 
     }); 

     app.UseWsFederationAuthentication(
      new WsFederationAuthenticationOptions 
      { 
       Wtrealm = realm, 
       MetadataAddress = adfsMetadata 
      }); 
    } 

は特にAuthenticationType値に認証を払う - それはClaimsIdentityコンストラクタで値と一致する必要があります。さもなければ、クッキーは設定されません。そうしないと、ログアウトできなくなります。

+0

助けてくれてありがとう! 何らかの理由で、まだCookieが設定されていません。誤って同じ名前のクラスを異なるナゲットパッケージで使用した場合があります。あるいは私のOwin設定ファイルが間違っているかもしれません。私の質問は、私のOwin Configurationがまさにそのように見えるように更新されました。私は今、仕事を中止していますので、明日まで再試行できません。 – ohyeah

+0

@ohyeah私の更新を見てください。 – trailmax

+0

素晴らしい作品です!この回答はADFSとはほとんど関係がないことに気付きました。そのため、私の最終的な解決策にあなたのコードを編集しました。うまくいけば、これをコピーしてプロジェクトに貼り付けるだけで十分です。 – ohyeah

関連する問題