簡體   English   中英

混合組和用戶的asp.net mvc [Authorize()]屬性

[英]asp.net mvc [Authorize()] attribute for mixed group and user

我正在使用帶有Windows身份驗證的ASP.NET MVC 1.1。 我試圖只授權小組成員和我自己。 我不是該小組的成員,也不需要成為該小組的成員。 每次訪問Web應用程序的URL時,我都會得到Windows登錄名/密碼提示。 HomeController具有

[HandleError]
[Authorize(Roles=@"MyDomain\\company.security.group.name")]  
[Authorize(Users=@"MyDoamin\\MyName")]
[OutputCache(Duration=86400,VaryByParam="PageIndex")]
public class HomeController : Controller

如何啟用這種授權? 該Web應用程序正在IIS6上的一個站點下運行。 該站點具有接受匿名的目錄安全性。 Web應用程序/虛擬目錄已禁用匿名,並啟用了Windows集成安全性。 web.config具有

您可以將AuthorizeAttribute子類型用於查看“用戶角色”。 從我的頭頂上(未試過):

using System;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    // This method must be thread-safe since it is called by the thread-safe OnCacheAuthorization() method.
    protected override bool AuthorizeCore(HttpContextBase httpContext) {
        base.AuthorizeCore(httpContext);

        if ((!string.IsNullOrEmpty(Users) && (_usersSplit.Length == 0)) ||
           (!string.IsNullOrEmpty(Roles) && (_rolesSplit.Length == 0)))
        {
            // wish base._usersSplit were protected instead of private...
            InitializeSplits();                
        }

        IPrincipal user = httpContext.User;
        if (!user.Identity.IsAuthenticated) {
            return false;
        }

        var userRequired = _usersSplit.Length > 0;
        var userValid = userRequired
            && _usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase);

        var roleRequired = _rolesSplit.Length > 0;
        var roleValid = (roleRequired) 
            && _rolesSplit.Any(user.IsInRole);

        var userOrRoleRequired = userRequired || roleRequired;

        return (!userOrRoleRequired) || userValid || roleValid;
    }

    private string[] _rolesSplit = new string[0];
    private string[] _usersSplit = new string[0];

    private void InitializeSplits()
    {
        lock(this)
        {
            if ((_rolesSplit.Length == 0) || (_usersSplit.Length == 0))
            {
                _rolesSplit = Roles.Split(',');
                _usersSplit = Users.Split(',');
            }
        }
    }
}

在為域/用戶和域/組字符串加上“ @”字符前綴時,您無需對反斜杠進行兩次轉義。 您可以嘗試將這些行替換為:

[Authorize(Roles="MyDomain\\company.security.group.name")]  
[Authorize(Users="MyDoamin\\MyName")]

要么

[Authorize(Roles=@"MyDomain\company.security.group.name")]  
[Authorize(Users=@"MyDoamin\MyName")]

進一步的了解還表明,授權過濾器將執行“用戶”和“角色”檢查。 如果用戶不能同時滿足這兩個要求,那么他們將被拒絕訪問。
要獲得所需的行為,您將需要編寫一個自定義授權過濾器,如上一個答案中所建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM