gpt4 book ai didi

c# - 允许 "semi anonymous"认证

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:52 26 4
gpt4 key购买 nike

我有一个案例,我需要一些 Controller 方法可以被经过身份验证的用户访问,或者如果请求在 url 中包含一种“访问 token ”。

例如:

经过身份验证的用户可以调用:https://example.com/some/resource

或者未经身份验证的用户可以进行相同的调用,但将某种 token 添加到 url(或作为 header ):https://example.com/some/resource?token=123abc

token 不必是 super secret ,只是一些难以猜测的东西。

[AllowSpecialToken]
[HttpGet]
[Route("some/resource")]
public async Task<string> GetSomeResource()
{
return "some resource";
}

我苦苦挣扎的是如何编写 AllowSpecialTokenAttribute。以及如何让它在我们现在已经到位的身份验证之前运行(使用 OpenIddict)。

这是一个愚蠢的用例吗?我应该寻找其他解决方案吗?

提供一些背景信息:我们有一个 SPA 调用我们的 API。 SPA 的某些页面可以通过发送链接与其他人(非用户)共享。该链接将包含 token 。这些页面的内容在安全方面并不重要,但不应完全公开。

最佳答案

您需要制作自己的身份验证属性。我过去做过类似的事情,这是我的 stub :

public class TokenAuthenticationAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
// this will read `token` parameter from your URL
ValueProviderResult valueProvided = filterContext.Controller.ValueProvider.GetValue("token");
if (valueProvided == null)
{
filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
return;
}

var providedToken = valueProvided.AttemptedValue;

var storedToken = "12345"; // <-- get your token value from DB or something

if (storedToken != providedToken)
{
filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
return;
}
}
}

然后用属性装饰你的 Action :

[TokenAuthentication]
[HttpGet]
[Route("some/resource")]
public async Task<string> GetSomeResource()
{
return "some resource";
}

让你的 URI 看起来像 https:\\www.example.com\api\some\resource?token=12345

关于c# - 允许 "semi anonymous"认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47331080/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com