2012-04-27 8 views
0

サブドメインサイトへのアクセスを処理する権限スキーマを設定しているだけでなく、ユーザーがサイト関連のデータにアクセスできることを確認しています。MVC承認発行/繰り返しログ入力

私はすべてのメソッドとすべてのテーブルにプロパティSiteIdを追加した「標準の」codefirstフォームの承認を使用します。

このように、異なるサブドメインサイトにログインするユーザーは、サブドメイン内で同じユーザー名を使用できます。

また、他のすべてのテーブルでsiteIDを使用して、顧客データなどで作業している権限のあるユーザーが、サブドメインのみに関連する顧客データを処理していることを確認します。

ローカルでは、devマシンで問題なく動作します。

しかし、私は一度Webホストにアプリを置くと、数分ごとにログイン画面にリダイレクトされます。私がログインしている他のすべてのサイトからリダイレクトされたサイトの1つで発生すると、 (site1.myapp.com、site2.maypp.com、....) すべてのサイトが同じサイトを指していますアプリケーション(site1.myapp.com)

だから、質問は以下のとおりです。

1) if anyone has an idea/experience in what may be the cause/solution for this and 

2) perhaps suggestion on different (better) implementation method 

システムはそれほど頻繁にログイン認証を求めるために引き起こしているキャッシングと何かがあるだろうか?続い

は私が持っている現在のセットアップの例である:

public class User 
{ 

    //Membership required 
    [Key()] 
    public virtual Guid UserId { get; set; } 
    public int SiteID { get; set; } 
    [Required()] 
    [MaxLength(20)] 
    public virtual string Username { get; set; } 
    [Required()] 
    [MaxLength(250)] 
    [DataType(DataType.EmailAddress)] 
    public virtual string Email { get; set; } 
    ... 

メンバシッププロバイダがサイトIDを使用して、同様である。

:私は各コントローラにおいて

public class CodeFirstMembershipProvider : CodeFirstExtendedProvider 
     { 

      private string _ApplicationName; 
      private int siteID = Convert.ToInt16(new AppSettings()["SiteID"]); 
      ... 
      ... 

      public override string ExtendedValidateUser(string userNameOrEmail, string password) 
      { 
      ... 
      ...      
       using (DbContext context = new DbContext()) 
       { 
        User user = null; 
        user = context.Users.FirstOrDefault(Usr =>(Usr.Username == userNameOrEmail) && (Usr.SiteID == siteID)); 
        if (user == null) 
        { 
         user = context.Users.FirstOrDefault(Usr => (Usr.Email == userNameOrEmail) && (Usr.SiteID == siteID)); 
        } 
        ... 
        ... 

[Authorize] 
public class CustomerController : Controller 
{ 
    int siteID = Convert.ToInt16(new AppSettings()["SiteID"]); 
... 

    public ViewResult Index() 
    { 
     var data = (from k in context.Customers 
        from ks in context.CustomerSites 
        where ((k.CustomerID == ks.CustomerID) && (ks.SiteID == siteID) && (ks.CompleteAccess == true)) 
        select (k)).ToList(); 
     ...   
     ... 

AppSettingsクラス::

を使用してSiteIDがキャッシュされています。
/// <summary> 
/// This class is used to manage the Cached AppSettings 
/// from the Database 
/// </summary> 
public class AppSettings 
{ 

    /// This indexer is used to retrieve AppSettings from Memory (only siteID for now) 

    public string this[string Name] 
    { 
    get 
    { 
    //See if we have an AppSettings Cache Item 
    if (HttpContext.Current.Cache["AppSettings"] == null) 
    { 
     int? SiteID = 0; 
     //Look up the URL and get the Tenant/Site Info 
     using (DbContext dc = 
      new DbContext()) 
     { 
      Site result = 
        dc.Sites 
        .Where(a => a.Host == 
        HttpContext.Current.Request.Url. 
         Host.ToLower()) 
        .FirstOrDefault(); 

      if (result != null) 
      { 
       SiteID = result.SiteID;    } 
     } 
     AppSettings.LoadAppSettings(SiteID, FirmaID); 
    } 

    Hashtable ht = 
     (Hashtable)HttpContext.Current.Cache["AppSettings"]; 
    if (ht.ContainsKey(Name)) 
    { 
     return ht[Name].ToString(); 
    } 
    else 
    { 
     return string.Empty; 
    } 
    } 

}

/// <summary> 
/// This Method is used to load the app settings from the 
/// database into memory 
/// </summary> 
public static void LoadAppSettings(int? SiteID) 
{ 
    Hashtable ht = new Hashtable(); 

    //Now Load the AppSettings 
    using (DbContext dc = 
    new DbContext()) 
    { 
     ht.Add("SiteID", SiteID); 
    } 

    //Add it into Cache (Have the Cache Expire after 3 Hour) 
    HttpContext.Current.Cache.Add("AppSettings", 
    ht, null, 
    System.Web.Caching.Cache.NoAbsoluteExpiration, 
    new TimeSpan(3, 0, 0), 
    System.Web.Caching.CacheItemPriority.NotRemovable, null); 
    } 
    } 

答えて

1

Aargh ....
私はそれを試してみました多くのものは、通常、非常に単純な問題/解決策として、であることが判明した後:

をこのアプリであるためホストされている共有ウェブホストマシンキーをweb.configに追加する必要がありました。 1を生成する (。私は私の開発マシン上でこのエラーを再現できなかった理由と、これはある)

リンクはこちらです:Machine key generator

関連する問題