加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET web api – 设置自定义IIdentity或IPrin

发布时间:2020-12-16 03:30:13 所属栏目:asp.Net 来源:网络整理
导读:在我们的asp.net mvc / web api项目中,我们希望使用AuthorizeAttribute自定义授权.我们注意到有两个不同的AuthorizeAttribute,一个用于MVC的System.Web.MVC命名空间,另一个用于web api的System.Net.Http命名空间. 它适用于MVC,我们的代码如下: public class
在我们的asp.net mvc / web api项目中,我们希望使用AuthorizeAttribute自定义授权.我们注意到有两个不同的AuthorizeAttribute,一个用于MVC的System.Web.MVC命名空间,另一个用于web api的System.Net.Http命名空间.

它适用于MVC,我们的代码如下:

public class MyPrincipal : IPrincipal
{
    //some custom properties
    public bool IsValid()
    {
        //custom authentication logic
    }

    private IIdentity identity;
    public IIdentity Identity
    {
        get { return this.identity; }
    }

    public bool IsInRole(string role)
    {
        return true;
    }
}

//override AuthorizeCore
public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        MyPrincipal user = new MyPrincipal();

        if (user.isValid())
        {
            httpContext.User = user;
        }
        else
        {
            httpContext.Response.Redirect("~/Common/NoAuthorize",true);
        }
    }
}

[MyAuthorizeAttribute]
public class BaseMyController : Controller
{
    protected virtual new MyPrincipal User
    {
        get { return HttpContext.User as MyPrincipal; }
    }
}

然后在MVC控制器中,我们可以通过MyPrincipal用户属性获取用户信息.

但是,当我们开始在web api中使用相同的方式时,我们发现web api没有HttpContext属性,而在System.Web.Http.AuthorizeAttribute中,要覆盖的方法接受HttpActionContext参数,它也没有HttpContext属性或者我们可以在其他地方设置MyPrincipal实例.

我注意到System.Web.Http.AuthorizeAttribute摘要说

Specifies the authorization filter that verifies the request’s IPrincipal

似乎还有其他一些方法来设置IPrincipal实例.

我不知道,有什么好建议吗?那么,为什么asp.net web api控制器没有HttpContext?有关于它的设计模式吗?

相关问题
ASP.NET MVC – Set custom IIdentity or IPrincipal

解决方法

我实现了一些东西作为概念证明,主要是这个: Authentication Filters in ASP.NET Web API 2

对于Web API,您可以创建一个Attribute,IAuthenticationFilter.
如果我没记错的话,你可以将它作为过滤器添加到WebApiConfig中的全局过滤器中

config.Filters.Add(new YourAuthenticationAttribute());

或者您可以将其用作api控制器/方法的属性.

然后,您可以实现AuthenticateAsync,获取请求的授权标头,检查方案并验证参数,如果一切都有效,则设置主体.

我认为这个想法是你可以在一个链中添加多个这些过滤器,它们都可以针对一组特定的需求进行身份验证,比如他们寻找的方案,以及主要设置链中的某个地方,或者返回一个挑战.

public class YourAuthenticationAttribute : Attribute,IAuthenticationFilter
{

public Task AuthenticateAsync(HttpAuthenticationContext context,CancellationToken cancellationToken)
{
HttpRequestMessage request = context.Request;

if (request.Headers.Authorization != null &&
    request.Headers.Authorization.Scheme.Equals("yourScheme",StringComparison.OrdinalIgnoreCase))
    {
        // get the value sent with the header.
        string authParam = request.Headers.Authorization.Parameter;

        // do some validation on the parameter provided...
        // if it's all valid,create a principal with claims:


    List<Claim> claims = new List<Claim>()
    {
        new Claim(ClaimTypes.Name,"Eddie Admin"),new Claim(ClaimTypes.Role,"Admin"),// new Claim(ClaimTypes.Role,"Delete"),};

    // create an identity with the valid claims.
    ClaimsIdentity identity = new ClaimsIdentity(claims,"yourScheme");

    // set the context principal.
    context.Principal = new ClaimsPrincipal(new[] { identity });

创建主体时,您可以应用声明,并根据常规授权属性检查这些声明.例如

[Authorize(Roles = "Admin")]

除此之外,我还没有使用它,但希望这能指出你正确的方向.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读