2017-12-14 11 views
4

通常の認証で標準のASP.NET MVCサイトをセットアップしました。私は役割を追加したので、新しいユーザーが特定の役割を果たします。標準のASP.NET MVCインストールテンプレートでユーザーを偽装する

今、私はユーザーを偽装したいと思っています。

:あなたは二つのことをしなければならないとして、これはデフォルトでは機能しません

 FormsAuthentication.SetAuthCookie(user.UserName, false); 

:私は周りに検索するときにアドバイスを

偽装を偽装

は、以下の方法来ます

1:

フォーム認証を有効にする:

<system.web> 
    <authentication mode="Forms" /> 
    </system.web> 

2:

モジュールを無効にします。

<system.webServer> 
    <modules> 
     <!--<remove name="FormsAuthentication" />--> 
    </modules> 
    <staticContent> 

挑戦

しかし、これを実行することは課題のカップルを残します。

  1. 偽装するとログアウトできません。これは簡単にログアウトに次のように追加すること で固定されているユーザならばFormsAuthentication.SignOut();
  2. 作業User.IsInRole(Constants.Roles.Creditor);停止は、そう 私たちは何をする役割

をチェックインできないのですか?

これは私にはわかりません - 明らかに、試してみてもメンバーシップフレームワークを完全に理解していません。しかし、あなたはここでどのように偽装して仕事をするのですか?

私は "フォーム"認証を使用する明白な理由はなく、このパスで開始した唯一の理由は偽装です。だから私は、私は2つの明確な方向持って参照してください。

  • A)別の方法で偽装を実装するので、私は、フォーム
  • Bを使用するために私の web.configファイルには手を触れないでください)フォームでの役割の問題を修正し

ここにヘルプがありますか? :-)

+0

を使用することができます。質問のFormsAuthenticationを参照していますが、asp.net-membershipとしてタグ付けされています。あなたは実際に何を使っていますか? –

+0

@ErikPhilips私は明らかに混乱しています。私はアイデンティティを使用していますが、スタンダードとして組み込まれています。私はそれらを一緒に混同しました。 –

+0

テストソリューションのzipファイルをどこかで共有できますか? –

答えて

4

これを達成するには、実際に行う必要があるのは、Idとコントローラの両方を取得し、永続化する方法(Cookie、Cache、Dbなど)を決定するだけです。

これを行う簡単な方法は、なりすましの申し立てを作成し、そのような種類の申し立てに対するポリシーを追加することです。クレームベースのポリシーを追加するためのリンクですここで

はあなたが始めるためにいくつかのコードです:あなたのコントローラで

あなたは私たちがユーザIDを望んでいた上記のコードで今、この

 var claims = await UserManager.GetClaimsAsync(CurrentUserId); 
     var claim = claims.FirstOrDefault(c => c.Type == "Impersonate"); 
     if (claim!=null) 
     { 
      //You may forget to remove it or the user could end there session before you are able to 
      var r = await UserManager.RemoveClaimAsync(CurrentUserId, claim); 
     } 
     var result = await UserManager.AddClaimAsync(CurrentUserId, new Claim("Impersonate", userId)); 

     if (!result.Succeeded) 
     { 
      return GetErrorResult(result); 
     } 

のような何かをするエンドポイントをお勧めしますが、しかし、私たちはその役割を簡単に得て、その主張でそれを救うことができました。ここから、この主張をどのように使用するかを決めるだけで済みます。下のリンクは、あなたがそれを行う方法を示しています。

https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims

はちょうどあなたが行われた後、請求を削除することを忘れないでください。

いつかあなたを偽装する必要があるかもしれない場合、この1つはうまく動作します。 1つのプロジェクト私はクライアントに取り組んで、他のクライアントの作業を完了するために一度に数週間ユーザーを偽装する必要がありました。

1

基本フォームプリンシパルにIsInRole()メソッドを実装する必要がある場合は、プリンシパルをカスタマイズする必要があります。

Userは、Identitiesのリストを含む主要なオブジェクトです。 Default identityにはroleプロパティが含まれていないため、カスタムIDオブジェクトを作成する必要があります。例えばのために

global.asax.cs

public override void Init() 
    { 
     this.PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest; 
     base.Init(); 
    } 

    void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e) 
    { 
     if (Request.IsAuthenticated) 
     { 
      HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
      if (authCookie != null) 
      { 
       FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);      
       Context.User = Thread.CurrentPrincipal = new CustomPricipal(authTicket.Name); 
      } 
     } 
    } 

public class CustomPricipal : IPrincipal 
{   
    public CustomPricipal(string username) 
    { 
     this.Identity = new CustomIdentity(username); 
    } 

    public IIdentity Identity 
    { 
     get; 
     private set; 
    } 

    public bool IsInRole(string role) 
    { 
     return this.Identity != null && ((CustomIdentity)this.Identity).Roles.Any(x => x.ToLower() == role.ToLower()); 
    } 
} 

public class CustomIdentity : IIdentity 
{ 
    public CustomIdentity(string name) 
    { 
     // We can fetch the user information from database and create custom properties 
     this.Name = name; 
     this.IsAuthenticated = true; 
     this.AuthenticationType = "Forms"; 
     this.Roles = new List<string>() { "Admin", "SuperAdmin" }; 
    } 
    public string AuthenticationType 
    { 
     get; 
     private set; 
    } 

    public bool IsAuthenticated 
    { 
     get; 
     private set; 
    } 

    public string Name 
    { 
     get; 
     private set; 
    } 
    public List<string> Roles 
    { 
     get; 
     private set; 
    } 
} 

今、私たちは、私はあなたの質問で少し混乱していUser.IsInRole("")

関連する問題