自定义AuthorizeAttribute

3

我有一个继承自AuthorizeAttribute的子类,名为CheckArticleExistence。

我想使用在action中接收到的参数来设置属性。就像这样:

[CheckArticleExistence(Id=articleId)]
public ActionResult Tags(int articleId)
{
...
}

我希望使用文章ID检查数据库中是否存在该文章,如果不存在,我可以使用OnAuthorization方法触发其他操作。
有没有办法实现这个需求呢? 谢谢。

这是在 OnAuthorization 阶段完成的吗? - Dan Atkinson
请问您能否更清楚地说明您想要对articleId做什么? - Dan Atkinson
3个回答

5
这个有效(谢谢!):
[CheckArticleExistence]
public ActionResult Tags(int articleId)
{
    ...
}

...

public class CheckArticleExistenceAttribute : AuthorizeAttribute
{
    private int articleId;

    public override void OnAuthorization(AuthorizationContext filterContext)
    {

        this.articleId = int.Parse(filterContext.RouteData.Values["id"].ToString());

        if (!Article.Exists(articleId))
        {
            ...
        }
    }
}

3

您可以在您的存储库中放置一个方法来检查文章是否存在。

public ActionResult Tags(int articleId)
{
    if (repository.ArticleExists(articleID))
    {
        // Do your thing
    }
    else
    {
        return view("NotFound"); // or do something else
    }
}

或者您可以尝试检索文章并检查是否为null对象。

public ActionResult Tags(int articleId)
{
    var article = repository.GetArticle();
    if (article !=null)
    {
        // Do your thing
    }
    else
    {
        return view("NotFound"); // or do something else
    }
}

是的,我同意。说实话,这可能是最好的选择。 - Dan Atkinson
但这是显而易见的方式...我想使用AuthorizeAttribute,因为如果我决定改变处理文章不存在的方式,我不需要更改所有检查文章是否存在的操作。无论如何,谢谢。 - Wellington
希望您的代码库始终只有一种检查方式。您可以在那里更改您的实现。 - Robert Harvey
1
这样做可以在id不存在的情况下更好地控制用户体验。过滤器也可以起作用,但是这样你就需要在控制器之外处理“用户逻辑”。过滤器应该用于恶意或异常情况。 - Matt Sherman

3

我认为你可以从AuthorizationContext中获取articleId,所以不需要将其作为属性传递。

你只需这样做:

[CheckArticleExistence]
public ActionResult Tags(int articleId)
{
...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接