在用户的电子邮件中使用[授权]属性

饼干

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

是否[Authorize("User=...")]具有其他属性?它可以接收电子邮件[Authorize("[email protected], [email protected]")](并且这样做?毫不奇怪,MSDN页面不是很有帮助。

这是内置的功能,还是我必须实现自己的自定义Authorize属性?我上面链接的MSDN页面很少,是否有关于Authorize属性上完整参数列表的文档?

艾丁

我在这里看不到任何区别...“ [email protected]”是一个字符串,就像“ James Doe”是一个字符串一样,两者都用于User属性。

就是说,如果您想拥有自己的属性,例如,UserName只需从Authorize属性派生新的Attribute类然后使用自己的授权逻辑添加自己的属性。

资源:


示例:自定义授权属性


HomeController.cs

public class HomeController : Controller
{
    [CustomAuthorize(FirstNames = "Aydin")]
    public ActionResult Index()
    {
        return View();
    }
}

ApplicationUser.cs || User.cs

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;
    }
}

CustomAuthorizeAttribute.cs

[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();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Outlook的HTML电子邮件中使用标题属性

来自分类Dev

使用PHP检查MYSQL是否存在用户和电子邮件

来自分类Dev

如何在应用程序中使用用户的电子邮件ID发送电子邮件(无意图)

来自分类Dev

在Django中使用电子邮件地址或用户名登录用户

来自分类Dev

如何使用Cognito身份ID获取用户属性(用户名,电子邮件等)

来自分类Dev

使用电子邮件和密码创建用户时,如何向用户对象添加属性?

来自分类Dev

在电子邮件中使用CSS圈子

来自分类Dev

如何防止用户使用已在 Drupal 8 中使用的电子邮件创建帐户?

来自分类Dev

即使用户未登录,授权属性仍然成功通过

来自分类Dev

自定义授权属性无法在asp.net中使用

来自分类Dev

Django-在用户个人资料管理中显示用户电子邮件

来自分类Dev

Django-在用户个人资料管理中显示用户电子邮件

来自分类Dev

同时拥有用户名和电子邮件,但在django-rest-auth中使用电子邮件对用户进行身份验证

来自分类Dev

在Rails中使用Devise gem时,如何创建没有电子邮件和密码的用户?

来自分类Dev

允许用户选择在CakePHP中的电子邮件模板中使用的字符串

来自分类Dev

如何在djangoreostframework-simplejwt中使用电子邮件代替用户名?

来自分类Dev

在Rails中使用Devise gem时,如何创建没有电子邮件和密码的用户?

来自分类Dev

在iOS中使用Facebook SDK登录时无法获取用户的电子邮件ID

来自分类Dev

允许用户选择在CakePHP中的电子邮件模板中使用的字符串

来自分类Dev

如何在 Alexa Skill 中使用 Java 获取亚马逊用户电子邮件

来自分类Dev

在imap授权登录形式中使用错误密码和电子邮件时如何避免警告?

来自分类Dev

如何注释身份用户的电子邮件属性?

来自分类Dev

在Wordpress用户注册上使用户电子邮件小写

来自分类Dev

Firebase规则(如果子集合中存在用户电子邮件)

来自分类Dev

Django的。在用户模型中拥有唯一电子邮件的最佳方法?

来自分类Dev

Rails:为什么在用户提交表单之前先发送电子邮件?

来自分类Dev

如何在用户注册时正确进行电子邮件验证?

来自分类Dev

如何在用户注册后发送 HTML 格式的自动激活电子邮件

来自分类Dev

如何在用户未输入电子邮件时发出弹出警报

Related 相关文章

  1. 1

    在Outlook的HTML电子邮件中使用标题属性

  2. 2

    使用PHP检查MYSQL是否存在用户和电子邮件

  3. 3

    如何在应用程序中使用用户的电子邮件ID发送电子邮件(无意图)

  4. 4

    在Django中使用电子邮件地址或用户名登录用户

  5. 5

    如何使用Cognito身份ID获取用户属性(用户名,电子邮件等)

  6. 6

    使用电子邮件和密码创建用户时,如何向用户对象添加属性?

  7. 7

    在电子邮件中使用CSS圈子

  8. 8

    如何防止用户使用已在 Drupal 8 中使用的电子邮件创建帐户?

  9. 9

    即使用户未登录,授权属性仍然成功通过

  10. 10

    自定义授权属性无法在asp.net中使用

  11. 11

    Django-在用户个人资料管理中显示用户电子邮件

  12. 12

    Django-在用户个人资料管理中显示用户电子邮件

  13. 13

    同时拥有用户名和电子邮件,但在django-rest-auth中使用电子邮件对用户进行身份验证

  14. 14

    在Rails中使用Devise gem时,如何创建没有电子邮件和密码的用户?

  15. 15

    允许用户选择在CakePHP中的电子邮件模板中使用的字符串

  16. 16

    如何在djangoreostframework-simplejwt中使用电子邮件代替用户名?

  17. 17

    在Rails中使用Devise gem时,如何创建没有电子邮件和密码的用户?

  18. 18

    在iOS中使用Facebook SDK登录时无法获取用户的电子邮件ID

  19. 19

    允许用户选择在CakePHP中的电子邮件模板中使用的字符串

  20. 20

    如何在 Alexa Skill 中使用 Java 获取亚马逊用户电子邮件

  21. 21

    在imap授权登录形式中使用错误密码和电子邮件时如何避免警告?

  22. 22

    如何注释身份用户的电子邮件属性?

  23. 23

    在Wordpress用户注册上使用户电子邮件小写

  24. 24

    Firebase规则(如果子集合中存在用户电子邮件)

  25. 25

    Django的。在用户模型中拥有唯一电子邮件的最佳方法?

  26. 26

    Rails:为什么在用户提交表单之前先发送电子邮件?

  27. 27

    如何在用户注册时正确进行电子邮件验证?

  28. 28

    如何在用户注册后发送 HTML 格式的自动激活电子邮件

  29. 29

    如何在用户未输入电子邮件时发出弹出警报

热门标签

归档