2017-12-18 17 views
1

LDAP Active Directoryに対してユーザーを認証し、メンバーシップに基づいて特定のビューへのアクセスを制限するプロジェクトがあります。ほとんどの作業はクラスで行われます/Models/AdAuthenticationService.csこれまでのところすべてうまく動作します。しかし、私は次の_Layout.cshtmlasp.net mvc名前の代わりにGivenNameと姓を表示する方法

マイAdAuthenticationServiceクラスでGIVENNAMEと姓などのユーザパラメータを表示できるようにしているように見えることはできません。

namespace MyFDM.Models { 
    public class AdAuthenticationService { 


    private ClaimsIdentity CreateIdentity(UserPrincipal userPrincipal) { 
     var identity = new ClaimsIdentity(MyAuthentication.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, userPrincipal.SamAccountName)); 
     identity.AddClaim(new Claim(ClaimTypes.GivenName, userPrincipal.GivenName)); 
     identity.AddClaim(new Claim(ClaimTypes.Surname, userPrincipal.Surname)); 
     identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userPrincipal.SamAccountName)); 
     if (!String.IsNullOrEmpty(userPrincipal.EmailAddress)) { 
     identity.AddClaim(new Claim(ClaimTypes.Email, userPrincipal.EmailAddress)); 
     } 

をそして、私の_LoginPartial.cshtmlは含まれています

@if (Request.IsAuthenticated) 
 
{ 
 
       <a href="#" class="dropdown-toggle" data-toggle="dropdown">Hello @User.Identity.Name!<span class="caret"></span></a>

私は、Identity名に属性のいずれかを割り当てることができます。

identity.AddClaim(new Claim(ClaimTypes.Name, userPrincipal.DisplayName)); 

これは、SamAccountNameの代わりに正しいユーザー名を表示します。

@if (Request.IsAuthenticated) 
 
{ 
 
       <a href="#" class="dropdown-toggle" data-toggle="dropdown">Hello @User.Identity.GivenName + @User.Identity.Surname!<span class="caret"></span></a>

しかし、私はこれを行う場合、私は次のエラーを取得: エラーCS1061「をIIdentity」の定義が含まれていません。しかし、私が本当に行う必要があることのようにGIVENNAME +姓を示しています'GivenName'ではなく、 'IIdentity'型の最初の引数を受け入れる拡張メソッド 'GivenName'が見つかりませんでした。

答えて

0

これは助けになるかどうかわかりませんが、これをやったやり方は、UserPrincipalを返すヘルパークラスのメソッドを作成することでした(プリンシパルを返さないか、すべてのプロパティが存在しないことを確認してください)。 )。このように:これはあなたが私は単にViewBag.UserName

[HttpGet] 
    public async Task<ActionResult> Index() { 
     ADServices ads = new ADServices(); 
     var userPrin = ads.GetUser(User.Identity.Name); 
     ViewBag.UserName = userPrin.GivenName + " " + userPrin.Surname; 
     ...(other code omitted) 
     return View(model); 
    } 

にそれを適用し、私の見解でそれを使用し、私のコントローラに詳細なhereを見つけることができるすべてのプロパティを提供

public class ADServices { 
     PrincipalContext prinContext = new PrincipalContext(ContextType.Domain, "ad"); 

     public UserPrincipal GetUser(string userName) { 
      UserPrincipal userPrin = UserPrincipal.FindByIdentity(prinContext, userName); 

      if (userPrin == null) { 
       throw new Exception("The username " + userName + " does not exist."); 
      } 

     return userPrin; 
    } 
} 

<p class="nav navbar-text navbar-right">Hello, @ViewBag.UserName!</p> 
関連する問題