ASP.net MVC4 のカスタム ロール プロバイダーに問題があります。非常に軽量の RoleProvider を実装しましたが、これは変更するまで問題なく動作するようです
[Authorize]
public class BlahController:....
}
に
[Authorize(Roles="Administrator")]
public class BlahController:....
}
その変更を行うとすぐに、ユーザーは認証されなくなり、401 エラーが発生します。私の RoleProvider は基本的に IsUSerInRole に対して true を返し、GetUserRoles に対して "Administrator" を含むリストを返すため、これは奇妙です。カスタム RoleProvider のすべてのメソッドにブレークポイントを設定しましたが、いずれも呼び出されていませんでした。
次に、AuthorizeAttribute から継承した独自の authorize 属性を実装しました。これで、何が起こっているかを確認できるようにブレークポイントを入れました。基になる属性によって呼び出される User.IsInRole() が false を返すことが判明しました。
ロール プロバイダーが適切に設定されていることを確信しています。設定ファイルにこれがあります
<roleManager enabled="true" defaultProvider="SimplicityRoleProvider">
<providers>
<clear />
<add name="SimplicityRoleProvider" type="Simplicity.Authentication.SimplicityRoleProvider" applicationName="Simplicity" />
</providers>
</roleManager>
ここで説明されている方法を使用して、どのロール プロバイダーが現在のロール プロバイダーであるかを確認します:現在の RoleProvider インスタンスを参照しますか? 正しい結果が得られます。ただし、User.IsInRole は引き続き false を返します。
Azure Access Control Services を使用していますが、それがカスタム ロール プロバイダーと互換性がない理由がわかりません。
IsInRole がカスタム RoleProvider から値を返すように IPrincipal User を修正するにはどうすればよいですか?
RoleProvider ソース:
public class SimplicityRoleProvider : RoleProvider { プライベート ILog ログ { get; 設定; }
public SimplicityRoleProvider()
{
log = LogManager.GetLogger("ff");
}
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
log.Warn(usernames);
log.Warn(roleNames);
}
public override string ApplicationName
{
get
{
return "Simplicity";
}
set
{
}
}
public override void CreateRole(string roleName)
{
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
return true;
}
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
log.Warn(roleName);
log.Warn(usernameToMatch);
return new string[0];
}
public override string[] GetAllRoles()
{
log.Warn("all roles");
return new string[0];
}
public override string[] GetRolesForUser(string username)
{
log.Warn(username);
return new String[] { "Administrator" };
}
public override string[] GetUsersInRole(string roleName)
{
log.Warn(roleName);
return new string[0];
}
public override bool IsUserInRole(string username, string roleName)
{
log.Warn(username);
log.Warn(roleName);
return true;
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
}
public override bool RoleExists(string roleName)
{
log.Warn(roleName);
return true;
}
}