如何开发接受登录名或令牌的自定义授权属性
本文关键字:令牌 自定义 属性 授权 登录 何开发 开发 | 更新日期: 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
{
..
它被处理为Authorize
和TokenAuthorize
(1)。我需要开发一种处理方法,例如Authorize
或TokenAuthorize
如果不存在令牌,则仅使用 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;
}
}
}
[令牌授权] 公共类 主控制器:控制器 {}