2009-08-14 23 views
7

私はASP.NET MVCアプリケーションに権限を追加する作業をしており、ロードブロックを実行しています。最終的に私たちのカスタムメンバーシッププロバイダーを結成させ、アプリケーションの認証を取得することができました。さて、コントローラに[Authorize]属性を追加すると、ページを表示するためにはユーザーが認証されている必要があります。また、特定のユーザーにページを制限する[Authorize(Users = "{userName}")]も正常にテストしました。HttpContext.Current.User.IsInRole(roleName)は常にfalseを返します

[Authorize(Roles = "{RoleName}")]が期待どおりに機能していないようです。その属性をコントローラに追加すると、対応するページにアクセスしようとするたびに、私はログインページにリダイレクトされます。これは、ユーザーに必要な役割がない場合に発生すると予想されるものですが、ユーザーにその役割があっても発生しています。 View、Controller、HelperメソッドでUser.IsInRole( "{roleName}")とHttpContext.Current.User.IsInRole( "{roleName}")の両方をチェックしていますが、これは常にFalseを返します。

私が働いているユーザーが、私が承認しようとしている役割を持っていることを確認しました。また、WebForms Appでこれらのユーザーをテストして、同じロールでページアクセスを制限しても問題なく動作します。私はどこかに何か設定が間違っているか、何か簡単なものが見つからないと思っていますが、午前中に検索した後、私は解決策に近づいたものを見つけていないので、ここで誰かが私を助けてくれることを望んでいます。

+0

あなたの回答を編集して、設定が何であるかを教えてください。これは他の人に将来役立つかもしれません。 – sirrocco

+0

sirrocco - 設定は私たちの実装と環境に固有のものなので、他の人にはあまり役に立ちません。 – Hamman359

+0

私のweb.configを再確認するようにコメントが表示され、roleManagerノードが有効になっていることがわかりました= "false"。私は、あなたが期待しているような何らかの例外を返すのではなく、IsInRoleに対して、それが無効の場合はfalseを返すことを人々に知りたがっています。 –

答えて

4

最初に、プロファイラを使用し、HttpContext.Current.User.IsInRole( "{roleName}")行を実行するときに、sqlクエリが何であるかを確認してください。

クエリが作成されていない場合は、おそらくcacheRolesInCookie = "true"で、IsInRoleはUserDataのFormsAuthenticationTicketをチェックしています。 FormsAuthenticationTicketを作成するときは、userdataパラメータをカンマ区切りの文字列に設定してください。

+0

これは問題を解決しませんでしたが、最終的には私の道を導きました。誰も気にしないように役割提供者を完全に派遣するために必要ないくつかの追加の設定があることが判明しました。一度私はそれらにつまずいた、すべての '魔法のように'仕事を始めた。 – Hamman359

+1

それは何だった、私は同じ問題がある、あなたは親切に私に知らせることができます –

0

ブラウザのCookieキャッシュをクリアしてみてください。私は同じような問題について頭を悩まされ、クッキーをクリアして問題を解決しました。ケースの他に

0

は、この質問を見つける:

私は同様の問題が発生し、問題がドメイングループ内のスペースでした。 HttpContext.Current.Userが返された場合、IsInRole()への呼び出しは、スペースを含まないWindows 2000以前のグループ名を使用して比較しているようです。

私のケースでは、IsInRole()に渡されたグループ名からスペースを取り除くことで問題が解決しました。

/// <summary> 
/// Removes all spaces from a string 
/// </summary> 
/// <param name="value">The string</param> 
/// <returns>The string without spaces</returns> 
public static string StripSpaces(this string value) 
{ 
    // my test using both long and short strings showed StringBuilder 
    // to be slightly faster at this than string.Replace() 

    StringBuilder b = new StringBuilder(value); 

    b.Replace(" ", string.Empty); 

    return b.ToString(); 
} 

また、あなたがスペースを含むドメイングループとのより良い動作するはずどのSystem.DirectoryServices.AccountManagement.UserPrincipalを使用してIsMemberOf()を呼び出すことができます。ここでは

はこれを行うには気の利いた拡張メソッドです。

2

私はOPと同様の問題を抱えていました。これは古い投稿ですが、私は私のために働いたものを置くと思っていました。私が見つけたのは、ロールプロバイダがweb.configで無効になっていたことです。私は真になるように設定し、私の問題を解決しました。

<configuration> 
    <system.web> 
     <roleManager enabled="true" defaultProvider="myRoleProvider"> 
+0

うん、笑、それをやった。これらの複雑なソリューションはすべて、単純なスイッチになります。ありがとう。 –

1

古いトピックのビットが、私は同様の問題があったとに原因があった。私はコード以来、最初のパラメータとして、ユーザーのIDトークン(GUID)を使用していた

FormsAuthentication.SetAuthCookie(string, bool) 

私は使用された変数tokenで作業していましたが、実際には有効なユーザー名でなければなりません。プロファイラを使用して、aspnetdbのストアドプロシージャを手動で実行した後、これを見つけました。 MSDNのドキュメントもこれを確認しています。

[Authorize]でも、ユーザーが役割を果たしていても、[Authorize(Roles="rolename")]が失敗します。

関連する問題