1

Authoriseという独自のAuthorize属性を作成しました...

Imports System.Security.Principal

<AttributeUsage(AttributeTargets.Method Or AttributeTargets.[Class], Inherited:=True, AllowMultiple:=True)>
Public Class AuthoriseAttribute
    Inherits AuthorizeAttribute

    Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext)

        Dim CookieName As String = FormsAuthentication.FormsCookieName

        If Not filterContext.HttpContext.User.Identity.IsAuthenticated OrElse filterContext.HttpContext.Request.Cookies Is Nothing OrElse filterContext.HttpContext.Request.Cookies(CookieName) Is Nothing Then
            HandleUnauthorizedRequest(filterContext)
            Return
        End If

        Dim AuthCookie = filterContext.HttpContext.Request.Cookies(CookieName)
        Dim AuthTicket = FormsAuthentication.Decrypt(AuthCookie.Value)
        Dim Roles As String() = AuthTicket.UserData.Split(","c)

        Dim UserIdentity = New GenericIdentity(AuthTicket.Name)
        Dim UserPrincipal = New GenericPrincipal(UserIdentity, Roles)

        filterContext.HttpContext.User = UserPrincipal
        MyBase.OnAuthorization(filterContext)

   End Sub

End Class

これを行ったので、次のように属性でrolesパラメーターを使用できます...

<Authorise(Roles:="Admin")>

これは、承認が必要な私のページで完全に機能します。ただし、承認を必要としない(したがって、承認属性を持たない)メインページでは、ユーザーが(a)ログインしているか、(b)管理者であるか、いいえ。例えば...

@If HttpContext.Current.User.Identity.IsAuthenticated Then
    ' Display a welcome message (this works)
    @If HttpContext.Current.User.IsInRole("Admin") Then
        ' Display a settings link (this does not work)
    End If
End If

「ウェルカムメッセージ」の部分は起動しますが、「設定リンク」の部分は起動しません。このビューにはAuthorize属性がないため、これは理にかなっています。

Authorize属性を持たないページでIsInRoleを確認するにはどうすればよいですか?

4

1 に答える 1

0

これに対する適切な解決策がありません。誰かが適切な解決策を投稿する前に、それが役立つかもしれない回避策だけです。

アクションには[Authorize]属性を使用しますが、部分的に表示されているときは常に、手動の「OnAuthorization」を実行します。

public class Authorize : AuthorizeAttribute
{
 public override void OnAuthorization(AuthorizationContext filterContext)
 {
   ....
 }

 public static void ManualOnAuthorization(HttpContext context)
 {
    if (context.User.Identity.IsAuthenticated && context.User.Identity.AuthenticationType == "Forms")
    {
        FormsIdentity fIdent = (FormsIdentity)context.User.Identity;
        var user = new CustomUser(fIdent.Ticket.UserData);
        var ci = new CustomIdentity(user);
        var p = new CustomPrincipal(ci);
        HttpContext.Current.User = p;
        Thread.CurrentPrincipal = p;
    }
 }
}

これをAuthorizeクラスに入れて、部分的に次のように使用します。

@if(User.Identity.IsAuthenticated)
    {
        Authorize.ManualOnAuthorization(HttpContext.Current); 
        if (User.IsInRole("Admin"))
        {
        }
    }
于 2013-01-02T15:51:17.080 に答える