2017-06-02 7 views
1

私は、アンケートのプラットフォームをすべての店舗リストのスコアとともに使用しています。ASP.NET MVC 5のアイデンティティユーザーに基づいてエンティティのフィルタを構築する

私は各ユーザーに、自分の地域のエリア(地域)に基づいて店舗を利用できるようにする必要があります。

私は私のMVCプロジェクトにMicrosoftアイデンティティを使用して、私はこのために2つだけaproachesが見つかりました:

1-各地域のプロファイルを構築し、私はログオンしたユーザーのプロファイル名に基づいてフィルタリングすることができますが - dbContext.Where(位置==プロファイル名)

2-領域を含むApplicationUserを拡張するので、私はdbContext.Where(位置== User.Identity.GetLocation())

または任意の他のオプションを使用してフィルタリングすることができますか?

私は2番目のオプションを実装することができました:

店舗モデル:

public enum PTLocationDistrict 
{ 
    [Display(Name = "Aveiro")] 
    Aveiro = 1, 
    [Display(Name = "Beja")] 
    Beja = 2, 
    [Display(Name = "Braga")] 
    Braga = 3 
} 

[Table("Stores")] 
public class Store 
{ 
    [Key] 
    public int Id { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateModified { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public PTLocationDistrict District { get; set; } 
} 

アイデンティティApplicationUser:

public class ApplicationUser : IdentityUser 
{ 
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
    { 
     // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 

     // Add custom user claims here 
     userIdentity.AddClaim(new Claim("PTLocationDistrict", this.PTLocationDistrict.ToString())); 

     return userIdentity; 
    } 

    // Additional properties for the Application User 
    public PTLocationDistrict? PTLocationDistrict { get; set; } 
} 

アイデンティティサービス:

public static PTLocationDistrict? GetPTLocationDistrict(this IIdentity identity) 
    { 
     Claim claim = ((ClaimsIdentity)identity).FindFirst("PTLocationDistrict"); 

     PTLocationDistrict value; 

     if (claim == null) 
     { 
      return null; 
     } 
     else if (Enum.TryParse(claim.Value, out value)) 
     { 
      return value; 
     } 
     else 
     { 

      return null; 
     } 
    } 

Dashbをoardレポートカウントサービス:

public int GetCountToday(PTLocationDistrict? ptLocationDistrict) 
{ 
    try 
    { 
     var today = DateTime.Today; 

     IQueryable<SurveySession> surveySessions = _dbContext.SurveySessions.AsNoTracking().AsQueryable(); 

     if (ptLocationDistrict != null) 
     { 
      surveySessions = surveySessions.Where(ss => ss.Location.District == ptLocationDistrict.Value); 
     } 

     int count = surveySessions 
          .Where(p => p.DateCreated >= today) 
          .Count(); 

     return count; 
    } 
    catch (Exception error) 
    { 
     _logger.Error("[Error in SurveyService.GetCountToday" - Error: " + error + "]"); 

     return 0; 
    } 
} 

コントローラーアクション:

public virtual ActionResult Index() 
{ 
    IndexViewModel model = new IndexViewModel(); 
    PTLocationDistrict? ptLocationDistrict = User.Identity.GetPTLocationDistrict(); 

    // Realizados Hoje 
    model.SurveyCountToday = _surveyService.GetCountToday(ptLocationDistrict); 

} 
+0

私はこの質問が少し広いと思います。一つは、どのように位置を決定していますか? Georouting? – nurdyguy

+0

こんにちは、ありがとう!ユーザーの場所は、店舗リストをフィルタリングする国の地域(この場合はポルトガル)のリストに基づいて、登録プロセスで指定されます。 – Patrick

+1

傍注として:PTLocationDistrictをnullableとして実装しません。代わりに* None = 0 *を追加し、これをデフォルトに設定します。 –

答えて

1

(場所に基づいてアクセスを拒否)の情報を識別するために使用されていないようです。したがって、'人物'テーブルがある場合は、アイデンティティモデルの外にその場所を格納し、このテーブルを場所フィールドの結合に使用することができます。

もしそうでなければ、単にその場所の主張を追加します。利点は、データベースからフィールドを検索することなく、主張を読み取ることができることです。 User.Identity.GetLocation()を使用することができます。これは、Locationを含むクレームを読み取る拡張機能であるとします。

フィールドロケーションでIdentityUserを拡張し、フィールドに基づいてクレームを追加することができます。しかし、変更する必要はないので、AspNetUserClaimsテーブルにクレームを追加する必要はありません。その場合、クレームはで自動的にがIDに追加されます。

クレームの値は、ユーザーがログアウトして再度ログインするか、トークンが期限切れになった場合にのみ更新されます。

- アップデート -

あなたはCustomClaimTypeを作成することができ、このような何か:

public const string LocationClaimType = "https://schemas.mycompany.com/claims/location"; 

は、それは本当に限り、それが一意に請求を識別できるよう、問題ではありません。

AspNetUserClaimsテーブルについてはあまり知られていません。claimtypeがカスタムのclaimtypeであるレコードを挿入し、特定のユーザーの値を設定します。そしてそれはアイデンティティに自動的に追加されます。 コードを使用してユーザーにクレームを追加することもできます。お使いのコントローラで

var identity = (System.Security.Claims.ClaimsIdentity)User.Identity; 
var res = identity.Claims.FirstOrDefault(c => c.ValueType == LocationClaimType)?.Value; 

あなたは上記のようなコードで(のgetLocationとの)アイデンティティを拡張することができます。 CompanyIdでも同じことができます。

どちらの場合も、プロパティーは変更されない可能性があるため、この追加情報を取得するためにデータベースを呼び出す必要はありません。

+0

こんにちは!私は、AspNetUserClaimsテーブルの使用に関する多くの情報を見つけることはできません。自分のプロジェクトにUser.Identity.GetCompanyId()を作成して、各ユーザーのデータをフィルタリングすることができます。私は非常に精通していますが、2つのオプションの中で最高のものかどうかはわかりません。 – Patrick

+0

GetCompanyIdとは何ですか?それはデータベースを呼び出すのか、それともクレームをフィルターに掛けますか?そしてあなたのビジネスの文脈に「Person」のようなテーブルがありますか? –

+0

GetCompanyIdは、ログされたユーザーの会社IDをユーザーテーブルから取得します。それはフィルタリングされません、私は個人テーブルがないため、アイデンティティテーブルに格納されているID、ユーザーのみです。私は、このアプローチをクレームテーブルで試す良い例は見つけられませんでした。結果にフィルタを適用するまでは、すべてを作成して管理する方法はありません。 – Patrick

関連する問題