C# 对用户使用[Authorize]属性';s电子邮件

C# 对用户使用[Authorize]属性';s电子邮件,c#,asp.net,.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,.net,Asp.net Mvc,Asp.net Web Api,我已经看到[Authorize]属性采用AuthorizeAttribute。像这样的用户属性[Authorize(“User=Alice,Bob”)](其中Alice/Bob是用户名,我想是吧?)。但是,在我的应用程序中,我只注册了用户的电子邮件地址 [授权(“用户=…”)是否具有其他属性?它是否可以接收电子邮件(并授权用户=alice@example.org, bob@example.org”)?毫不奇怪,这一点没有多大帮助 这是内置的功能,或者我必须实现我自己的自定义授权属性吗?有没有关于

我已经看到
[Authorize]
属性采用AuthorizeAttribute。像这样的用户属性
[Authorize(“User=Alice,Bob”)]
(其中
Alice
/
Bob
是用户名,我想是吧?)。但是,在我的应用程序中,我只注册了用户的电子邮件地址

[授权(“用户=…”)
是否具有其他属性?它是否可以接收电子邮件(并授权用户=alice@example.org, bob@example.org”)?毫不奇怪,这一点没有多大帮助


这是内置的功能,或者我必须实现我自己的自定义授权属性吗?有没有关于授权属性的完整参数列表的文档,超过我上面链接的非常少的MSDN页面?

我看不出有什么不同……”james。doe@example.com是一根弦,就像“詹姆斯·多伊”是一个字符串,两者都在用户属性上使用

也就是说,如果您想要拥有自己的属性,例如,
UserName
,那么只需从
Authorize
属性派生一个新的属性类,并使用自己的授权逻辑添加自己的属性

资源:


示例:自定义授权属性
HomeController.cs
ApplicationUser.cs | | User.cs
公共类用户:IdentityUser
{
公共字符串名{get;set;}
公共异步任务GenerateUserIdentityAsync(用户管理器)
{
ClaimsIdentity userIdentity=wait manager.createidentitysync(这是DefaultAuthenticationTypes.applicationcokie);
userIdentity.AddClaim(新声明(“FirstName”,this.FirstName));
返回用户身份;
}
}

自定义属性.cs
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,AllowMultiple=true)]
公共类CustomAuthorizationAttribute:FilterAttribute,IAAuthorizationFilter
{
私有静态只读字符[]SplitParameter=新字符[1]{',};
私有字符串名;
私有字符串[]firstNamesSplit=新字符串[0];
公共字符串名
{
获取{返回this.firstNames??string.Empty;}
设置
{
this.firstNames=值;
this.firstNamesplit=SplitString(值);
}
}
///当进程请求授权时调用。
授权时的公共虚拟无效(AuthorizationContext filterContext)
{
如果(filterContext==null)
{
抛出新ArgumentNullException(“filterContext”);
}
if(OutputCacheAttribute.IsChildActionCacheActive(filterContext))
{
抛出新的InvalidOperationException(“无法与ChildAction缓存一起使用”);
}
if(filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute)),true)||
filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute),true))
{
返回;
}
if(this.AuthorizeCore(filterContext.HttpContext))
{
HttpCachePolicyBase缓存=filterContext.HttpContext.Response.cache;
SetProxyMaxAge(新的时间跨度(0L));
AddValidationCallback(this.CacheValidateHandler,null);
}
其他的
这个.HandleUnauthorizedRequest(filterContext);
}
///重写时,为自定义授权检查提供入口点。
受保护的虚拟布尔核(HttpContextBase httpContext)
{
如果(httpContext==null)抛出新的ArgumentNullException(“httpContext”);
IPrincipal user=httpContext.user;
如果(!user.Identity.IsAuthenticated)返回false;
string claimValue=ClaimsPrincipal.Current.FindFirst(“FirstName”).Value;
返回此.firstNamesplit.Length新建
{
拆分项目,
splitItemTrim=splitItem.Trim()
})
.Where(value=>!string.IsNullOrEmpty(value.splitItemTrimmed))
.Select(value=>value.splitItemTrimmed).ToArray();
}
}

Authorizez不在乎用户名是登录名还是电子邮件。如果您使用的是现成的身份提供程序,电子邮件就是用户名。您最好考虑使用“角色”而不是“名字”。您的角色可以是管理员、标准、增强等,您可以简单地以相同的方式分配角色。你将如何处理一个控制器操作,必须处理多个不同姓名的人。通过经验了解到这一点,尽管测试非常简单,但你的目标是拥有自己的财产吗?或者利用微软已经实现的功能。我对很少的文档感到失望,希望理解这里的用户参数,并为我的用例使用最佳实现。我最初开始时发现的有用内容是来自PluralSight的视频,这个特别的视频可能会提供一些见解。。。还有这个。也跳过MSDN。。。这就是您正在寻找的Aydin,您有关于如何查找用户对象的实现细节吗?如果是的话,你能把它添加到你的答案中吗?事实上,我刚离开家用手机打字。。。。我可以在几小时后回家后再加上。。。同时,我可以给你一个快速的概述。当您首次对自己进行身份验证时,identity framework会对您的凭据和角色进行加密,并将其作为cookie存储在客户端计算机上。在您的操作执行到身份验证筛选器的路由之前,下次再次访问您的网站时。筛选器检查存储在cookie中的凭据是否与auth属性中指定的约束匹配
public class HomeController : Controller
{
    [CustomAuthorize(FirstNames = "Aydin")]
    public ActionResult Index()
    {
        return View();
    }
}
public class User : IdentityUser
{
    public string FirstName { get; set; }
    
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager)
    {
        ClaimsIdentity userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        userIdentity.AddClaim(new Claim("FirstName", this.FirstName));
        return userIdentity;
    }
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class CustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
    private static readonly char[] SplitParameter = new char[1] {','};
    private string firstNames;
    private string[] firstNamesSplit = new string[0];

    public string FirstNames 
    {
        get { return this.firstNames ?? string.Empty; }
        set
        {
            this.firstNames = value;
            this.firstNamesSplit = SplitString(value);
        }
    }

    /// <summary> Called when a process requests authorization. </summary>
    public virtual void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (OutputCacheAttribute.IsChildActionCacheActive(filterContext))
        {
            throw new InvalidOperationException("Cannot use with a ChildAction cache");
        }

        if (filterContext.ActionDescriptor.IsDefined(typeof (AllowAnonymousAttribute), true) ||
            filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof (AllowAnonymousAttribute), true))
        {
            return;
        }

        if (this.AuthorizeCore(filterContext.HttpContext))
        {
            HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
            cache.SetProxyMaxAge(new TimeSpan(0L));
            cache.AddValidationCallback(this.CacheValidateHandler, null);
        }
        else
            this.HandleUnauthorizedRequest(filterContext);
    }

    /// <summary> When overridden, provides an entry point for custom authorization checks. </summary>
    protected virtual bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null) throw new ArgumentNullException("httpContext");

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

        string claimValue = ClaimsPrincipal.Current.FindFirst("FirstName").Value;
        return this.firstNamesSplit.Length <= 0 ||
               this.firstNamesSplit.Contains(claimValue, StringComparer.OrdinalIgnoreCase);
    }

    private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus)
    {
        validationStatus = this.OnCacheAuthorization(new HttpContextWrapper(context));
    }

    /// <summary> Processes HTTP requests that fail authorization. </summary>
    protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new HttpUnauthorizedResult();
    }

    /// <summary>  Called when the caching module requests authorization. </summary>
    /// <returns>  A reference to the validation status.  </returns>
    protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext)
    {
        if (httpContext == null) throw new ArgumentNullException("httpContext");
        return !this.AuthorizeCore(httpContext)
            ? HttpValidationStatus.IgnoreThisRequest
            : HttpValidationStatus.Valid;
    }

    private string[] SplitString(string original)
    {
        if (string.IsNullOrEmpty(original)) return new string[0];

        return original.Split(SplitParameter)
            .Select(splitItem => new
            {
                splitItem,
                splitItemTrimmed = splitItem.Trim()
            })
            .Where (value => !string.IsNullOrEmpty(value.splitItemTrimmed))
            .Select(value => value.splitItemTrimmed).ToArray();
    }
}