如何开发接受登录名或令牌的自定义授权属性

本文关键字:令牌 自定义 属性 授权 登录 何开发 开发 | 更新日期: 2023-09-27 18:33:09

在我的MVC 5应用程序中,我按如下方式装饰我的控制器:

[Authorize]
public class Controller
{
  ..

但是,我的一个要求是使用令牌来授权操作,而无需进入登录屏幕。 即:http://{website}/Action?token={/* token for this user */}

因此,如何开发接受登录(默认行为)或令牌(自定义,必需行为)的自定义授权属性?

换句话说,如果我使用 http://{website}/Action ,我将被重定向到

登录屏幕(如果我未经授权),但如果我使用 http://{website}/Action?token={/* token for this user */} ,我将被授权并重定向到所述操作。


[TokenAuthorize]

public class TokenAuthorize : AuthorizeAttribute
{
    private const string SecureToken = "token";
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (Authorize(filterContext))
        {
            return;
        }
        HandleUnauthorizedRequest(filterContext);
    }
    private bool Authorize(AuthorizationContext actionContext)
    {
        try
        {
            HttpRequestBase request = actionContext.RequestContext.HttpContext.Request;
            string token = request.Params[SecureToken];
            return SecurityManager.IsTokenValid(token);
        }
        catch (Exception)
        {
            return false;
        }
    }
}

如果我用以下方法装饰我的控制器:

[Authorize]
[TokenAuthorize]
public class Controller
{
  ..

它被处理为AuthorizeTokenAuthorize (1)。我需要开发一种处理方法,例如AuthorizeTokenAuthorize

如何开发接受登录名或令牌的自定义授权属性

如果不存在令牌,则仅使用 TokenAuthorize 进行装饰,然后回退到默认行为怎么样?

令牌授权.cs

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    bool isTokenAuthorized = HasValidToken(...);
    if(isTokenAuthorized) return true;
    bool isDefaultAuthorized = base.AuthorizeCore(httpContext);
    if(isDefaultAuthorized) return true;
    return false;
}

我的控制器.cs

[TokenAuthorize]
public class MyController
{
    ...
}
<</div> div class="answers">

Shoe的回答让我走上了正确的轨道。

我实施了他的建议,并在我的Authorize函数中做了以下操作:

private bool Authorize(AuthorizationContext actionContext)
{
    try
    {
        HttpContextBase context = actionContext.RequestContext.HttpContext;
        string token = context.Request.Params[SecurityToken];
        bool isTokenAuthorized = SecurityManager.IsTokenValid(token);
        if (isTokenAuthorized) return true;
        bool isDefaultAuthorized = AuthorizeCore(context);
        return isDefaultAuthorized;
    }
    catch (Exception)
    {
        return false;
    }
}
只需

[TokenAuthorize]装饰,我可以通过登录(默认)或通过令牌授权操作。

完美代码:验证来自数据库的令牌

public class TokenAuthorize : AuthorizeAttribute
{
    string _connectionString;
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (Authorize(filterContext))
        {
            return;
        }
        HandleUnauthorizedRequest(filterContext);
    }

    protected bool Authorize(AuthorizationContext httpContext)
    {
        bool isTokenAuthorized = HasValidToken();
        if(isTokenAuthorized) return true;
        return false;
    }
    protected bool HasValidToken()
    {
        string token = string.Empty;
        token = HttpContext.Current.Request.Params["token"];
        _connectionString = WebConfigurationManager.ConnectionStrings["SqlConnectionString"].ConnectionString;
        SqlTransaction txn = null;
        using (SqlConnection conn = new SqlConnection(_connectionString))
        {
            conn.Open();
            txn = conn.BeginTransaction();
            List<SqlParameter> parameters = new List<SqlParameter>();
            SqlParameter parameter = new SqlParameter();
            parameters.Add(new SqlParameter("@token", token));
            parameter = new SqlParameter("@return_ops", 0);
            parameter.Direction = ParameterDirection.Output;
            parameters.Add(parameter);
            SqlHelper.ExecuteNonQuery(txn, CommandType.StoredProcedure, "[master_LoggedInUsers]", parameters.ToArray());
            int result = Convert.ToInt32(parameters[1].Value);
            if (result <= 0)
            {
                return false;
            }
            else return true;
        }
    }
}

[令牌授权] 公共类 主控制器:控制器 {}