ユーザーが複数の役割を持つ複雑な Web サイトを開発しています。ユーザーは、DB 内の他の項目にも関連付けられており、ユーザーの役割とともに、Web サイトで何を表示および実行できるかを定義します。
現在、一部のユーザーは複数の役割を持っていますが、Web サイトは複雑な構造のため、一度に 1 つの役割しか処理できません。
ユーザーがログインすると、Web サイトの隅にドロップダウンが表示され、そこで役割の 1 つを選択できるようになります。ロールが 1 つしかない場合、ドロップダウンはありません。
ここで、最後に選択したロールの値を、ユーザーのその他の設定と共に DB に保存します。彼が戻ってきたとき、このように役割はまだ記憶されています。
ドロップダウンの値は、Web サイト全体からアクセスできる必要があります。私は2つのことをしたい:
- 現在のロールを に保存し
Session
ます。 - メソッドをオーバーライドするか、元のメソッドのようにすべてのロールではなく、現在選択されているロールへのすべてのアクセスをチェック
IsInRole
するメソッドを作成します。IsCurrentlyInRole
IsInRole
セッションの保存部分については、それを行うのが良いと思いましたGlobal.asax
protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
if (User != null && User.Identity.IsAuthenticated) {
//check for roles session.
if (Session["CurrentRole"] == null) {
NASDataContext _db = new NASDataContext();
var userparams = _db.aspnet_Users.First(q => q.LoweredUserName == User.Identity.Name).UserParam;
if (userparams.US_HuidigeRol.HasValue) {
var role = userparams.aspnet_Role;
if (User.IsInRole(role.LoweredRoleName)) {
//safe
Session["CurrentRole"] = role.LoweredRoleName;
} else {
userparams.US_HuidigeRol = null;
_db.SubmitChanges();
}
} else {
//no value
//check amount of roles
string[] roles = Roles.GetRolesForUser(userparams.aspnet_User.UserName);
if (roles.Length > 0) {
var role = _db.aspnet_Roles.First(q => q.LoweredRoleName == roles[0].ToLower());
userparams.US_HuidigeRol = role.RoleId;
Session["CurrentRole"] = role.LoweredRoleName;
}
}
}
}
}
しかし、どうやらこれにより実行時エラーが発生します。Session state is not available in this context.
- これを修正するにはどうすればよいですか? また、このコードを配置するのに本当に最適な場所ですか?
- 他のすべての機能を失うことなく、ユーザー (
IPrincipal
?)を拡張するにはどうすればよいですか?IsCurrentlyInRole
- 多分私はこれをすべて間違ってやっています.これを行うためのより良い方法はありますか?
どんな助けでも大歓迎です。