Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何开发接受登录或令牌的自定义属性?_C#_Asp.net Mvc 5_Authorization_Custom Attributes - Fatal编程技术网

C# 如何开发接受登录或令牌的自定义属性?

C# 如何开发接受登录或令牌的自定义属性?,c#,asp.net-mvc-5,authorization,custom-attributes,C#,Asp.net Mvc 5,Authorization,Custom Attributes,在我的MVC 5应用程序中,我将控制器装饰如下: [Authorize] public class Controller { .. 然而,我的一个要求是使用令牌来授权操作,而无需进入登录屏幕。ie:http://{website}/Action?令牌={/*此用户的令牌*/} 因此,如何开发接受登录(默认行为)或令牌(自定义、必需行为)的自定义属性? 换句话说,如果我使用http://{website}/Action,我将被重定向到登录屏幕(如果我未被授权),但是如果我使用http://{

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

[Authorize]
public class Controller
{
  ..
然而,我的一个要求是使用令牌来授权操作,而无需进入登录屏幕。ie:
http://{website}/Action?令牌={/*此用户的令牌*/}

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

换句话说,如果我使用
http://{website}/Action
,我将被重定向到登录屏幕(如果我未被授权),但是如果我使用
http://{website}/Action?token={/*此用户的token*/}
,我将被授权并重定向到所述操作


[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
。我需要开发一种处理方法,例如
授权
令牌授权

如果不存在令牌,只使用
令牌授权
进行装饰,然后返回默认行为如何

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;
}
[TokenAuthorize]
public class MyController
{
    ...
}
MyController.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;
}
[TokenAuthorize]
public class MyController
{
    ...
}
鞋子让我走上了正确的道路

我执行了他的建议,并在我的
授权
功能中执行了以下操作:

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]
进行装饰,我可以通过登录(默认)或通过令牌来授权操作。

完美代码:从DB验证令牌
公共类令牌授权:AuthorizeAttribute
{
字符串连接字符串;
授权时的公共覆盖无效(AuthorizationContext filterContext)
{
if(授权(过滤上下文))
{
返回;
}
HandleUnauthorizedRequest(filterContext);
}
受保护的bool授权(AuthorizationContext httpContext)
{
bool isTokenAuthorized=HasValidToken();
如果(i)返回true;
返回false;
}
受保护的bool HasValidToken()
{
string-token=string.Empty;
token=HttpContext.Current.Request.Params[“token”];
_connectionString=WebConfiguration Manager.connectionString[“SqlConnectionString”]。connectionString;
SqlTransaction txn=null;
使用(SqlConnection conn=newsqlconnection(_connectionString))
{
conn.Open();
txn=conn.BeginTransaction();
列表参数=新列表();
SqlParameter参数=新的SqlParameter();
添加(新的SqlParameter(“@token”,token));
参数=新的SqlParameter(“@return\u ops”,0);
parameter.Direction=ParameterDirection.Output;
参数。添加(参数);
SqlHelper.ExecuteNonQuery(txn,CommandType.storedProcess,“[master_LoggedInUsers]”,parameters.ToArray());
int result=Convert.ToInt32(参数[1].Value);
如果(结果)